最近在学习elasticsearch软件,并搭建一个简单的查询服务。所以在此记录所有最近使用elasticsearch的流程。
首先贴出官方文档链接,网上的资料太杂,还是官方的靠谱(吐槽一下,官方文档的链接有时打不开)。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
安装elasticsearch7.6.1
由于当前es的最新版本是es7.6.1且我使用的是centos系统,所以我这里下载的是elasticsearch-7.6.1-linux-x86_64.tar.gz。下载后解压到你想安装的地方即可(注意不要使用root账户,否则后面启动时会报错)。
tar -zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz
注意,该版本的es中已经集成了java包,所以不需要额外去下载配置Java。解压后直接运行es文件夹中bin目录下的elasticsearch二进制文件即可。
./elasticsearch-7.6.1/bin/elasticsearch
我这里由于系统配置问题,报了如下错误:
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
接下来我们修改下系统的默认配置:
1)针对错误[1],打开limits.conf文件
sudo vim /etc/security/limits.conf
在文件末尾处加上:
* soft nofile 65535
* hard nofile 65535
2) 针对错误[2],打开sysctl.conf文件
sudo vim /etc/sysctl.conf
在文件末尾加上:
vm.max_map_count = 262144
修改配置后重启,然后再运行二进制文件看到终端打印started就成功了。
./elasticsearch-7.6.1/bin/elasticsearch
如果想让局域网内的其他主机访问该服务,就修改下es的yml文件:
vim ./elasticsearch-7.6.1/config/elasticsearch.yml
这里要将network.host设置成0.0.0.0,注意冒号后有空格
network.host: 0.0.0.0
配置完后重启es,在打开浏览器访问:ip+端口号(默认9200),就能看到es返回的信息。
安装ik分词器
es自带的默认分词器对于中文分词就是简单粗暴的将中文语句分成一个个汉字,明显这样是不合理的,所以这里下载针对中文分词的ik分词器,下载链接如下。
https://github.com/medcl/elasticsearch-analysis-ik/releases
注意下载的版本要与我们安装的es版本对应,我们这里下载的是v7.6.1所以ik也要下载v7.6.1版本。这里直接下载elasticsearch-analysis-ik-7.6.1.zip。下载后先到es目录下的plugins目录下创建ik目录,然后将下载好的ik压缩包解压到刚刚创建的ik目录中即可。重启es后我们能够看到ik分词器已载入。
设置es账号密码登录
- 首先设置X-Pack
打开es的yml配置文件:
vim ./elasticsearch-7.6.1/config/elasticsearch.yml
在文件末尾加上如下配置信息:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
- 设置密码
执行es的bin目录下的elasticsearch-setup-passwords二进制文件设置密码
./elasticsearch-7.6.1/bin/elasticsearch-setup-passwords interactive
Enter password for [elastic]:
Reenter password for [elastic]:
Passwords do not match.
Try again.
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
设置密码后,再使用浏览器访问es服务就提示先输入账号密码,就是刚刚设置的elastic的账户密码。
安装kibana
kibana是es官方推荐的es可视化工具,类似于Navicat for mysql工具,方便我们操作es并查看es中的数据。(elasticsearch-head也是es的常见可视化工具,有兴趣的可以了解下)下载同样直接再es的官网就能下载,这里也注意下版本kibana-7.6.1-linux-x86_64.tar.gz,和我们下载的es版本保持一致是7.6.1,接着将他解压到你想放的位置。
tar -zxvf kibana-7.6.1-linux-x86_64.tar.gz
然后对kibana进行配置,同样打开yml文件(在刚解压的文件夹里):
vim ./kibana-7.6.1-linux-x86_64/config/kibana.yml
这里就简单配置了server.host让局域网内其他设备可见,elasticsearch.hosts为部署es服务的主机ip以及端口号,还有上一步中设置的登录账号密码。
接着启动kibana服务:
./kibana-7.6.1-linux-x86_64/bin/kibana
启动后我们打开浏览器,输入部署kibana服务的主机IP+端口号(默认5601)
输入刚刚设置的elastic账号密码就能登录进去。登录进去后打开dev tool,测试下我们刚刚装的ik分词器,通过右侧的返回结果,我们能够看到ik分词效果还是很不错的。
关于如何使用kibana可视化工具,可参考官方文档。
https://www.elastic.co/guide/cn/kibana/current/introduction.html
es常用操作
创建index并设置mapping
这里假设我要创建一个名为test的index(es7中的index可以理解为mysql中的一张表,不建议使用type属性了),注意setting中的number_of_replicas设置的是0,因为我这里使用的是单机,没有使用集群。还有在es中创建index后一般是无法在修改mapping了,想修改setting的话需要先关闭index才能修改,具体可参考这个链接。在setting中设置了默认的analyzer为ik_max_word,在mapping中设置了我们要存储的元素“name”,“class”和“icon”且这三个字段都设置为“text”类型。创建后右侧返回成功的信息。
查看mapping
在kibana的Console中输入以下指令:
GET test/_mapping
数据迁移
有时当你更改了索引mapping后并不会对之前的数据起作用,此时需要新建一个表,并将之前的数据迁移过去。在kibana的Console中输入以下指令。
POST _reindex
{"source": {"index": "test"},"dest": {"index": "new-test"}
}
同义词加载
1)首先在es的config目录下创建analysis文件夹
mkdir ./elasticsearch-7.6.1/config/analysis
2)创建保存同义词的txt文档
touch ./elasticsearch-7.6.1/config/analysis/synonyms.txt
3)然后在synonyms.txt文件中添加同义词(注意一定要使用utf-8编码),我这里就添加了一行。
西红柿,番茄=>圣女果
4)修改setting中的分析器
因为我们刚刚创建了索引 test,所以修改setting需要先关闭index
写着修改setting,注意在analysis中定义了filter其中的synonym是自定义的过滤器,在自定义过滤器中载入了刚刚创建的同义词txt文档。接着在analyzer的default分析器中调用自定义filter即可。
修改完setting后开启index
5)接着在test中插入了两条数据,一条name为番茄,一条name为圣女果,接着我们查询name为西红柿的字段,发现同义词全部被查询到。
插入数据
插入数据这里使用的是POST方法,注意我们创建名为test的index后,系统会自动创建一个名为_doc的type,所以这里请求url的test后有个_doc,最后的1是我们传入的_id参数(这里的_id是一个唯一标识符),如果不传入这个参数系统会自动生成一个_id。接着我们传入name,class以及icon参数。
如果不指定_id系统会自动生成一个_id
更新数据
更新数据官方给了两种方法,一种是更新整个文档,一种是更新部分文档。
更新整个文档:这是使用的PUT方法,注意需要在url中指定更新的文档_id
部分更新文档:这里使用的是POST方法,注意更新的内容要在doc结构中且只需要给出更新的内容部分即可。
查询数据
es的查询方式非常丰富,没有做不到的只有想不到的,具体查看官方文档,这里给个基础实例:
这里就直接查询name="1"的文档,右侧是返回的信息,在hits的hits中是查询文档信息。
删除数据
指定删除某一文档:指定删除某一文档需要指定删除文档的_id
根据查询结果删除文档:这里可以根据查询结果去删除文档,示例中的match_all代表删除该index下的所有文档。