ElasticSearch 单机部署
单机部署
下载 Elasticsearch
我们下载的Elasticsearch 版本是 7.17.5,下载地址
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-5
1 | wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.5-linux-x86_64.tar.gz |
配置 Elasticsearch
关闭防火墙
1 | systemctl status firewalld.service |
配置elasticsearch.yml
该配置文件是ES的主配置文件
1 | vi elasticsearch.yml |
1 | #设置允许访问地址,配置位0.0.0.0允许任意主机访问 |
修改Linux句柄数
查看当前最大句柄数
1 | sysctl -a | grep vm.max_map_count |
修改句柄数
1 | vi /etc/sysctl.conf |
1 | + vm.max_map_count=262144 |
生效配置
修改后需要重启才能生效,不想重启可以设置临时生效
1 | sysctl -w vm.max_map_count=262144 |
关闭swap
因为ES的数据大量都是常驻内存的,一旦使用了虚拟内存就会导致查询速度下降,一般需要关闭swap,但是要保证有足够的内存
临时关闭
1 | swapoff -a |
永久关闭
1 | vi /etc/fstab |
注释掉
swap
这一行的配置
修改最大线程数
因为ES运行期间可能创建大量线程,如果线程数支持较少可能报错
配置修改
修改后需要重新登录生效
1 | vi /etc/security/limits.conf |
1 | 添加以下内容 |
重启服务
1 | reboot |
创建ES用户
注意ES不能以 root 用户启动,否则会报错
添加用户
1 | useradd elasticsearch |
增加管理员权限
增加sudoers权限
1 | vi /etc/sudoers |
1 | + elasticsearch ALL=(ALL) ALL |
修改Elasticsearch权限
给ES的安装目录进行授权
1 | chown -R elasticsearch:elasticsearch elasticsearch-7.17.5 |
JVM配置
根据自己的内存自行调整,内存不够则会启动失败
1 | vi jvm.options |
1 | - ##-Xms4g |
添加IK分词器
因为后面要用到IK分词,所以我们要安装以下IK分词器
查找
在github中下载对应版本的分词器
1 | https://github.com/medcl/elasticsearch-analysis-ik/releases |
根据自己的ES版本选择相应版本的IK分词器,因为安装的ES是
7.17.5
,所以也下载相应的IK分词器
解压
将下载的分词器复制到ES安装目录的
plugins
目录中并进行解压
1 | mkdir ik && cd ik |
启动ElasticSearch
切换用户
切换到刚刚创建的
elasticsearch
用户
1 | su elasticsearch |
启动命令
我们可以使用以下命令来进行使用
1 | 前台启动 |
访问测试
访问对应宿主机的
9200
端口
1 | http://192.168.245.151:9200/ |
重启ElasticSearch
查找进程
先查找ElasticSearch的进程号
1 | ps -ef | grep elastic |
杀死进程
杀死对应的进程
1 | kill -9 49736 |
启动ElasticSearch
注意不要使用ROOT用户启动
1 | sh bin/elasticsearch -d |
kibana安装
下载安装 Kibana
kibana 版本 7.17.5
下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-17-5
1 | wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.5-linux-x86_64.tar.gz |
配置 Kibana
1 | vi config/kibana.yml |
1 | - #server.port: 5601 |
启动 Kibana
切换用户
Kibana也不能以root用户运行,需要切换到
elasticsearch权限
1 | su elasticsearch |
启动kibaba
1 | 前台运行 |
访问测试
访问对应宿主机的
5601
端口
1 | http://192.168.245.151:5601/ |
ES快速入门
下面我们看下ES的一些基本使用
索引管理
我们使用数据库的第一步就是创建数据库,同样ES也是一样的,第一步也是对索引进行管理
列出索引
我们使用索引的第一步就是列出索引,查看当前数据库有哪些索引
1 | GET /_cat/indices?v |
创建索引
我们接下来要使用索引就需要创建索引了,Elasticsearch使用PUT方式来实现索引的新增
可以在创建索引的时候不添加任何参数,系统会为你创建一个默认的索引,当然你可以添加附加一些配置信息
1 | PUT customer |
这样我们就创建了一个索引
查看索引
索引创建完成后,我们接下来就需要对索引进行查询
1 | get customer |
结果说明
这里返回了一堆数据,具体什么含义呢,我们需要查看字段的详细信息
字段 | 内容 |
---|---|
aliases | 别名 |
mappings | 映射 |
settings | 配置 |
settings.index.creation_date | 创建时间 |
settings.index.number_of_shards | 数据分片数,索引要做多少个分片,只能在创建索引时指定,后期无法修改 |
settings.index.number_of_replicas | 数据备份数,每个分片有多少个副本,后期可以动态修改 |
settings.index.uuid | 索引id |
settings.index.provided_name | 名称 |
索引是否存在
有时候我们需要检查索引时候存在,我们可以使用HEAD命令验证索引是否存在
1 | HEAD customer |
出现200表示索引存在
关闭索引
在一些业务场景,我们可能需要禁止掉某些索引的访问功能,但是又不想删除这个索引
1 | post customer/_close |
这里我们就把这个索引给关闭了
查看索引列表
再次查看索引列表,查看索引的状态
1 | GET /_cat/indices?v |
我们发现索引已经被关闭了
为什么关闭索引
如果关闭了一个索引,就无法通过Elasticsearch 来读取和写人其中的数据,直到再次打开它
在现实世界中,最好永久地保存应用日志,以防要查看很久之前的信息,另一方面,在Elasticsearch中存放大量数据需要增加资源,对于这种使用案例,关闭旧的索引非常有意义,你可能并不需要那些数据,但是也不想删除它们。
一旦索引被关闭,它在Elasticsearch内存中唯一的痕迹是其元数据,如名字以及分片的位置,如果有足够的磁盘空间,而且也不确定是否需要在那个数据中再次搜索,关闭索引要比删除索引更好,关闭它们会让你非常安心,随时可以重新打开被关闭的索引,然后在其中再次搜索
打开索引
如果我们需要继续启动索引可以直接打开索引
1 | post customer/_open |
现在我们已经打开了索引
查看索引列表
1 | GET /_cat/indices?v |
现在索引的状态已经是打开的状态了
删除索引
如果索引中的数据已经不需要了,可以被删除,我们是可以删除索引的,使用以下命令可以删除索引
1 | delete customer |
这样我们就把索引给删除了
映射管理
映射的创建时基于索引的,你必须要先创建索引才能创建映射,es中的映射相当于传统数据库中的表结构,数据存储的格式就是通过映射来规定的
创建映射
可以在创建索引时指定映射,其中
mappings.properties
为固定结构,指定创建映射属性
1 | PUT customer |
查看映射
查看索引完全信息,内容包含映射信息
1 | GET customer/_mapping |
文档管理
创建文档(业务ID)
创建文档的时候我们可以手动来指定ID,但是一般不推荐,回对ES插入性能造成影响
如果手动指定ID,为了保证ID不冲突,会先查询一次文档库,如果不存在则进行插入,手动插入多了一次查询操作,性能会有损失。
操作说明
- 文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
- 注意需要在索引后面添加
_doc
,表示操作文档 - 在未指定id生成情况,每执行一次post将生成一个新文档
- 如果index不存在,将会默认创建
使用示例
新增文档,自动生成文档id,并且如果如果添加文档的索引不存在时会自动创建索引
1 | post customer/_doc/1 |
这样我们就创建了一个文档
返回结果说明
1 | { |
创建文档(自动ID)
为了提高插入文档效率,我们一般会使用自动生成ID,这样减少一次插入时的查询性能损耗,插入时不指定文档ID,ES就会自动生成ID
自动生成的ID是一个不会重复的随机数,使用GUID算法,可以保证在分布式环境下,不同节点同一时间创建的_id
一定是不冲突的
1 | post customer/_doc |
这样创建了一个文档,并且文档ID是系统自动生成的
_id
更新文档
更新文档和插入文档一样,如果文档ID一致则会进行覆盖更新,而更新又分为全量更新和增量更新
全量更新
和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
1 | post customer/_doc/1 |
增量更新
通过指定
_doc
方式默认是全量更新,如果需要更新指定字段则需要将_doc
改为_update
,请求内容需要增加doc表示,原始{“key”: value}
,更新{“doc”: {“key”: value}}
1 | post customer/_update/1 |
查询文档
验证是否存在
可以通过以下命令检查文档是否存在
1 | HEAD customer/_doc/1 #查看是否存储,返回200表示已存储 |
查询文档
1 | GET customer/_doc/1 #返回源数据的查询 |
不返回source
有时候只是查询,不需要具体的源文档字段,这样可以提高查询速度,可以使用以下方式
1 | GET customer/_doc/1?_source=false |
查询所有
上述只能查询单个,可以查询所有文档,将
_doc
替换为_search
1 | GET customer/_search |
删除文档
根据文档ID删除
我们可以根据文档ID进行删除
1 | DELETE customer/_doc/1 #指定文档id进行删除 |
根据条件删除
根据查询条件删除,会先查询然后在删除,可能耗时会比较长
1 | post customer/_delete_by_query |
中文分词器
IKAnalyzer
IKAnalyzer是一个开源的,基于java的语言开发的轻量级的中文分词工具包
从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本,在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化
使用IK分词器
IK提供了两个分词算法:
ik_smart:最少切分。
ik_max_word:最细粒度划分。
ik_smart
使用案例
原始内容
1 | 传智教育的教学质量是杠杠的 |
测试分词
1 | GET _analyze |
ik_max_word
使用案例
原始内容
1 | 传智教育的教学质量是杠杠的 |
测试分词
1 | GET _analyze |
自定义词库
我们在使用IK分词器时会发现其实有时候分词的效果也并不是我们所期待的
问题描述
例如我们输入“传智教育的教学质量是杠杠的”,但是分词器会把“传智教育”进行拆开,分为了“传”,“智”,“教育”,但我们希望的是“传智教育”可以不被拆开。
解决方案
对于以上的问题,我们只需要将自己要保留的词,加到我们的分词器的字典中即可
编辑字典内容
进入elasticsearch目录
plugins/ik/config
中,创建我们自己的字典文件yixin.dic
,并添加内容:
1 | cd plugins/ik/config |
扩展字典
进入我们的elasticsearch目录 :
plugins/ik/config
,打开IKAnalyzer.cfg.xml
文件,进行如下配置:
1 | vi IKAnalyzer.cfg.xml |
再次测试
重启ElasticSearch,再次使用kibana测试
1 | GET _analyze |
可以发现,现在我们的词汇”传智教育”就不会被拆开了,达到我们想要的效果了