一.简介
Elasticsearch是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。
全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
二.倒排索引与正向索引
-
正向索引:基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
-
倒排索引:对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档,倒排索引是为了解决非结构化数据的检索问题而产生的。
三.Elasticsearch 的基本概念
(1)index 索引:索引类似于mysql 中的数据库,Elasticesearch 中的索引是存在数据的地方,包含了一堆有相似结构的文档数据。
(2)type 类型:类型是用来定义数据结构,可以认为是 mysql 中的一张表,type 是 index 中的一个逻辑数据分类
(3)document 文档:类似于 MySQL 中的一行,不同之处在于 ES 中的每个文档可以有不同的字段,但是对于通用字段应该具有相同的数据类型,文档是es中的最小数据单元,可以认为一个文档就是一条记录。
(4)Field 字段:Field是Elasticsearch的最小单位,一个document里面有多个field
(5)shard 分片:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
(6)replica 副本:任何服务器随时可能故障或宕机,此时 shard 可能会丢失,通过创建 replica 副本,可以在 shard 故障时提供备用服务,保证数据不丢失,另外 replica 还可以提升搜索操作的吞吐量。
四.match、term、range区别,text、keyword区别、bool查询
-
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term,range主要用于数值、日期等非字符类型数据的范围查询
-
text支持模糊查询,且会进行分词操作。keyword不支持模糊查询,且不支持分词操作。
-
+bool查询中的查询条件
-
must (must字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回)
-
should (只要符合其中一个条件就返回)
-
must_not (与must相反,也就是说可以有多个并列的查询条件,一个文档各个子条件后才最终的结果都不满足)
-
filter(条件过滤查询,过滤条件的范围用range表示gt表示大于、lt表示小于、gte表示大于等于、lte表示小于等于)
-
五.ES创建文档的过程
-
客户端发送请求给任意结点,这个结点成为协调结点
-
根据文档id确定当前文档应该写入到那个结点中去,协调节点会把请求路由到这个节点
-
这个结点将这个文档的数据写入主分片,然后让对应的副本分片对应的结点来同步文档数据
-
当主分片和所有的副本分片都执行成功后,主分片节点向协调结点报告成功,协调结点向客户端报告写入成功
六.ES搜索文档的过程
-
Query阶段
-
客户端发送请求给任意节点,这个节点成为协调节点
-
该协调节点将这个查询广播到索引里面的每一个分片(主shard或副本shard),每个分片在本地执行查询请求后会生成一个命中文档的优先级队列。这个队列的size等于from+size
-
每个分片返回各自优先队列中所有文档的 ID 和打分值给协调节点,协调节点合并这些值到自己的优先队列中来产生一个全局排序后的结果列表
-
-
Fetch阶段
协调节点向包含这些文档id分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据整合返回给客户