首先这篇文章学了会让你知道如下内容
- 什么是es
- es的安装
- es的相关概念
- es的使用
- es的集群
什么是es?
es全称为ElasticSearch,是一个具有即时搜索功能的服务器,基于Lucene,为什么会有它的出现,如果对数据库频繁的进行查询,会造成查询过慢,所以有了es,可以快速地进行关键词字符串搜索,并且可以实现高亮。
solr和es的区别
- 首先solr支持多种格式的文本存储,而es只支持json格式
- solr需要zoonkeeper进行分布式管理,而es自身带有分布式协调功能
- 在实时搜索方面,es优于solr
es的安装
es是也是一个服务器,大家可以选择不同的安装方式,可以官网下载压缩包进行解压启动,或者使用Docker进行安装,这里我们使用windows压缩解压安装。
官方网址:https://www.elastic.co/products/elasticsearch
这里我下载的是es5.6.8版本,es更新很频繁现在已经7x了,不过es5版本相对来说更稳定。
解压如下:
进入bin目录点击
即可启动成功,浏览器打开http://localhost:9200看到如图返回,即可
es的相关概念
- 索引 一个索引相当于一个数据库
- 类型 一个类型相当于一个表
- 文档 一个文档相当于表中的一行数据
- 映射 可以设置字段的类型,是否索引,是否存储,是否分词,以及设置分词器
- 字段 相当于数据库表的一列
- 分片 将一个索引库划分多片,如果不分片,当数据多了,访问速度就慢了,可以让数据对应一个索引的多个片,分片查询
- 复制 为了高可用,当一个索引库的数据挂掉,复制的数据同样可以进行查询
es的可视化插件head
安装这个插件,可以方便的查看索引库,数据,进行查询。
如下就是head插件启动后的样子,需要有node.js环境,后续我会专门出一篇文章教大家安装head插件
es的使用
这里我们使用postman工具进行es的相关操作,大家自行安装。
需要注意的是es有两个端口号 一个是9200 一个是9300 前者是http端口,后者是tcp端口
- 创建index索引库 创建的时候就创建mapping
其中blog1是索引的名称,发送的实体是创建映射关系,其中article是type,还有id,title,content是字段,其中字段下的type,store,index,analyzer,分别是字段的类型,是否存储,是否索引,分词器的类型。默认存储,默认分词,默认使用标准分词器。
我们设置id不用索引也就是不用分词。 - 创建索引库 创建成功之后再设置mapping
发送一个put请求,之后创建成功索引之后,再来设置mapping
发送一个post请求,其中hello是类型,_mapping标志设置mapping信息。 - 删除索引
delete请求,后面跟索引名字就可删除 - 创建文档
格式:http://localhost:9200/index/type/_id
其中1是指的document的id,一般和数据的id一致。
- 更新文档
更新文档和存储文档是一样的,不过更新是先删除后存储。
可以看到返回结果是updated - 删除文档
url指定到对应文档id即可删除。 - 查询文档
根据id进行查询
其中_source是返回结果
查看标准分词器的结果是将查询文本 分成每一个汉字,效果并不好,之后我们安装ik分词器插件,(安装步骤再下面)重新创建mapping信息,将tilte和content的analyzer改为ik_max_word。再来进行查询
- 根据query_string进行查询
查询结果
query_string是将查询字符串分词之后再进行查询。 - 根据term关键词查询
请求: http://localhost:9201/blog1/article/_search
_search是查询标志,可以看到查询到了,如果查询客户端的使用是查询不到的,需要进行query_string进行查询。因为在分词结果中没有客户端的使用这个分词结果。
安装ik分词器
ik分词器对中文分词友好,采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。下面教大家怎么安装ik分词器
下载压缩包解压放到es服务器的plugins目录即可
重新启动服务器即可。
ik分词器采用了两种分词算法
- ik_smart算法 最少切分
- ik_max_word算法 最细粒度划分
- 我们可以试一下这两种有什么区别 如果使用标准分词器 会将中文汉字一个一个拆分
- 使用ik_smart算法
- 使用ik_max_word算法
ik_max_word最后将程序员分成了程序和员两个词,所以说它是细粒度算法。
es的集群
集群相关概念
- cluster 集群 一个集群下面有多个结点
- node 结点 一个节点相当于一个服务器,属于一个集群
- 分片和复制 shards&replicas 索引分片后在不同的结点,默认分片数量5,复制一份,复制后的每一片也分布在不同的结点。
es如何进行集群
- 新建一个文件夹es_cluster,拷贝三份es服务器在文件夹下
- 删除es下的data目录下的数据,此目录存储索引数据
- 修改config目录下的配置文件elasticsearch.yml
- 加入以下内容 用head插件连接es服务器的时候,需要配置允许跨域访问,因为head插件的端口是9100,访问es的端口为9200,所以需要设置。
#安装了head插件之后 配置允许跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群环境配置
cluster.name: my-elasticsearch
node.name: node-1
network.host: 127.0.0.1
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301", "127.0.0.1:9302", "127.0.0.1:9303"]
接下来修改剩下的两个配置信息,只需要修改node-name和http.port与transport.tcp.port即可。
- 然后依次启动es 打开head插件 连接任意一个结点,如下图
星星标志代表主节点 就是第一个启动的,圆形代表副结点。
分了5片,复制一份,共10片,分布在不同的节点,这里我之前创建了blog1,所以会显示索引信息。
加粗的数字 代表是主数据(primary为true),不加粗的是复制数据/拷贝数据