Elasticsearch (ES) 是一个基于 Lucene 的开源搜索和分析引擎,它提供了一个分布式、多租户能力的全文搜索引擎,带有 HTTP 网络接口和基于 JSON 的文档。以下是 Elasticsearch 的写入流程和构建倒排索引原理,以及读取流程的概述。
写入流程
-
客户端请求:客户端通过 HTTP 请求将文档发送到 Elasticsearch 集群中的一个节点(通常是 master 节点)。
-
协调节点:接收到请求的节点会成为协调节点(coordinating node),它负责路由请求到正确的分片(shard)。
-
路由到分片:根据文档的 ID 和索引设置中的分片数量,协调节点计算出文档应该存储在哪个分片上。
-
主分片写入:文档被写入到其对应的主分片(primary shard)上。
-
副本分片写入:如果启用了副本(replicas),主分片会将文档复制到其对应的副本分片(replica shard)上,以确保数据的高可用性。
-
写入确认:一旦文档被成功写入主分片和所有副本分片(取决于写入的一致性设置),协调节点会向客户端发送写入成功的确认。
-
刷新操作:在写入过程中,文档首先被写入到一个内部缓冲区中。为了提高写入性能,Elasticsearch 不会立即将缓冲区中的数据写入到磁盘上的索引文件中。当缓冲区达到一定大小或经过一定的时间后,会触发一个刷新(refresh)操作,将缓冲区中的数据写入到磁盘上的新段(segment)中。
构建倒排索引原理
Elasticsearch 使用 Lucene 作为其核心索引和搜索引擎。Lucene 使用倒排索引来支持高效的全文搜索。倒排索引的构建过程如下:
-
文档分词:首先,将文档中的文本内容分割成单个的词语或短语(称为词项)。
-
建立词项字典:创建一个词项字典,其中每个唯一的词项都有一个对应的条目。
-
倒排列表:对于每个词项,创建一个倒排列表,其中包含所有包含该词项的文档 ID 和词项在文档中的位置信息(如词频、起始偏移等)。
-
存储倒排列表:将倒排列表存储在磁盘上,以便后续搜索时能够快速访问。
-
合并段:随着时间的推移,会有多个段被创建。为了提高搜索效率,Lucene 会定期将这些段合并成一个更大的段,同时优化存储和删除过时的数据。
读取流程
-
客户端请求:客户端发送搜索请求到 Elasticsearch 集群中的一个节点。
-
协调节点:和写入流程一样,接收请求的节点会成为协调节点。
-
路由到分片:协调节点根据搜索请求中的索引和查询条件,确定需要查询哪些分片。
-
查询分片:协调节点向每个相关的分片发送查询请求。
-
执行查询:每个分片在本地执行查询,检索匹配查询条件的文档。
-
结果合并:分片将查询结果返回给协调节点,协调节点将来自所有分片的结果合并成一个全局结果集。
-
返回结果:协调节点将全局结果集返回给客户端。
在整个读取流程中,Elasticsearch 利用倒排索引来快速定位包含查询词项的文档,并根据查询条件对结果进行排序和过滤。此外,Elasticsearch 还支持复杂的查询操作,如聚合、过滤、高亮等,以满足不同的搜索和分析需求。
1093



被折叠的 条评论
为什么被折叠?



