ElasticSearch–简单入门
总结于同学大佬的学习ElasticSearch,以及慕课网一些教程
简介
Elaticsearch ,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得变得简单。
安装
因为用是 win 本,mac 的没怎么用过,这里说一下 win 下的安装
- 可以选择去官网下载你想要的版本(下图所示位置),因为一般用的都是 5.x 版本的,新版本会有些旧命令不兼容
- 当然这里下载是比较慢的,百度网盘的应该会快一点吧,我把他上传到了网盘上。(点击下载,提取码:0qc5)
- JDK 版本要求为 1.8 以上,默认占用端口 9300,9200
- 解压下载好的文件,进入 bin 目录点击启动脚本启动(我这里是 5.6.10 版本)
- 浏览器输入 localhost:9200(我这里是改了下端口,后续测试集群改的,改不改无所谓的)
安装可视化管理工具
- 因为他本身需要 Node.js 运行环境,这里不再赘述如何安装 Node.js ,在当前这个 head 文件夹这里打开命令行或者 powershell 按顺序执行下面语句(
注意一定要在 head 这个文件夹内操作
)
1
| npm install -g grunt-cli
|
- 在浏览器里输入 localhost:9100 就可以看到图形化界面了
- 连接前还需配置一下 es 的配置文件 ==》elasticsearch-5.6.10\config\elasticsearch.yml
- 在文件末尾加入下面两句话:
1 2
| http.cors.enabled: true http.cors.allow-origin: "*"
|
创建索引
- 可以直接在 head 内的复合查询里写 json 语句进行创建,也可以通过 postman 创建,因为 es 支持 restful 风格的接口进行访问,或者可以在 head 索引那里直接创建,不过这样创建的就是 非结构化的索引,即 mappings 里是空的。
postman
可以看出结构很清晰,restful 风格访问 9200 端口,用put
创建一个叫 blog 的索引(删除是delete
),然后 json 形式设置 mappings 结构,里面会再细分比如说 articles 文章类型,然后规定 文章类型 的各种属性,id、title、content 等等,然后这些属性也可以再定义更细的类型,分词策略等等。
这里可以和MySQL
数据库进行类比:
- 索引(blog)就相当于 MySQL 的 database
- 类型(articles)相当于 table
- 文档 相当于 一条 score 记录,是可以被索引到的最基本的数据
下面那个 settings,就是设置分片的个数和分片备份的个数,默认就是分片是 5,备份数为 1。
五个分片分别对应 0,1,2,3,4,而备份就是下面这个 框 比较细的 1,2,这个就是对 1,2 分片的备份。而框比较粗的就是真正的分片。
集成分词器
- 下载
elasticsearch-analysis-ik-5.6.10
,注意版本与 es 版本保持一致。(下载地址)
- 下载解压出来的所有文件,粘贴到新建的一个目录下,ik-analyzer 文件夹下(这个是新建的)
这里提供两种分词策略:
ik-smart 为最少切分
测试结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "河北", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 2 }, { "token": "大学", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 3 }, { "token": "青年", "start_offset": 6, "end_offset": 8, "type": "CN_WORD", "position": 4 } ] }
|
ik-max-word 为最精细切分
结果略过,会尽可能切分组合成新词
新建索引库
以后我们创建索引库就可以这样指定分词器进行创建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| { "mappings":{ "hello":{ "properties":{ "id":{ "type":"long", "store":true }, "title":{ "type":"text", "store":true, "analyzer":"ik_smart" }, "content":{ "type":"text", "store":true, "analyzer":"ik_smart" } } } } }
|
集群配置
ES 的集群配置还是比较简单的,在 config 下的 elasticsearch.yml 进行修改:
master节点配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| cluster.name: my-elasticsearch
node.name: master
node.master: true
node.data: true
network.host: 127.0.0.1
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:902"]
|
slave节点配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| cluster.name: my-elasticsearch
node.name: slave1 node.master: false
network.host: 127.0.0.1
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
|
完整配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。 默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。 这些功能是由两个属性控制的。 node.master和node.data 默认情况下这两个属性的值都是true。 下面详细介绍一下这两个属性的含义以及不同组合可以达到的效果。 node.master:这个属性表示节点是否具有成为主节点的资格 注意:此属性的值为true,并不意味着这个节点就是主节点。 因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。 所以,这个属性只是代表这个节点是不是具有主节点选举资格。 node.data:这个属性表示节点是否存储数据。 这两个属性可以有四种组合: 第一种:这种组合表示这个节点即有成为主节点的资格,又存储数据, 这个时候如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。 elasticsearch默认每个节点都是这样的配置,在测试环境下这样做没问题。实际工作中建议不要这样设置, 这样相当于主节点和数据节点的角色混合到一块了。 node.master: true node.data: true 第二种:这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。 这个节点我们称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。 node.master: false node.data: true 第三种:这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。 这个节点我们称为master节点 node.master: true node.data: false 第四种:这种组合表示这个节点即不会成为主节点,也不会存储数据, 这个节点的意义是作为一个client(客户端)节点,主要是针对海量请求的时候可以进行负载均衡。 node.master: false node.data: false 默认情况下,每个节点都有成为主节点的资格,也会存储数据,还会处理客户端的请求。 在一个生产集群中我们可以对这些节点的职责进行划分。 建议集群中设置3台以上的节点作为master节点【node.master: true node.data: false】 这些节点只负责成为主节点,维护整个集群的状态。 再根据数据量设置一批data节点【node.master: false node.data: true】 这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大 所以在集群中建议再设置一批client节点【node.master: false node.data: false】 这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。 master节点:普通服务器即可(CPU 内存 消耗一般) data节点:主要消耗磁盘,内存 client节点:普通服务器即可(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点)
|
配置效果