Elasticsearch 写入数据的工作原理
1. 写入流程概述
当客户端向 Elasticsearch 发送写入请求时,会经历以下步骤:
- 客户端选择一个节点 作为
coordinating node
(协调节点),发送请求。 - 协调节点对文档进行路由,根据文档 ID 计算哈希值,确定其应该存储在哪个 primary shard 上。
- Primary shard 处理请求,然后将数据同步到所有的 replica shard。
- 当 primary 和所有 replica 完成后,协调节点向客户端返回写入成功的响应。
2. 写入的底层机制
- 数据先写入内存 buffer,此时数据不可搜索。
- 同时写入 translog 日志文件,防止宕机时数据丢失。
- 定期执行 refresh(默认 1s),将 buffer 中的数据写入 segment 文件,并存储在
os cache
中,使其可搜索。 - 当 translog 过大或默认 30 分钟触发 flush,将数据真正持久化到磁盘上的 segment 文件,并清空 translog。
- Segment merge:ES 会定期合并小 segment,减少查询时的开销,但 merge 过程可能影响写入性能。
这就是为什么 Elasticsearch 是 Near Real-Time (NRT)
,因为数据写入后 1s 之内才能被搜索到。
Elasticsearch 查询数据的工作原理
1. 通过 doc_id
进行查询
- 客户端发送查询请求到任意节点(coordinating node)。
- 协调节点基于
doc_id
计算哈希,找到存储该文档的 shard。 - 随机选择 primary 或 replica shard 进行查询(采用 round-robin 负载均衡)。
- 查询结果返回给协调节点,然后再返回给客户端。
2. 全文检索过程(搜索 query)
全文检索是 Elasticsearch 的核心功能,比如搜索 java
,ES 会返回所有包含 java
的文档。
- 客户端发送搜索请求到协调节点。
- 协调节点将查询分发到所有 primary 或 replica shard。
- Query Phase: 每个 shard 返回匹配的
doc_id
列表。 - Fetch Phase: 协调节点根据
doc_id
读取文档,合并、排序、分页,并返回最终结果。
3. 查询优化机制
为了提升查询效率,Elasticsearch 采用多种优化策略:
- Query Cache:对于相同的查询,缓存结果,减少重复计算。
- Shard Preference:优先查询特定的 shard,避免不必要的 IO 负担。
- Index Sorting:在索引阶段提前排序,提高查询时的效率。
倒排索引:Elasticsearch 的核心
倒排索引是搜索引擎最重要的数据结构,它允许快速查询包含某个关键词的文档。
1. 倒排索引的基本原理
示例文档:
DocId | 文档内容 |
---|---|
1 | 谷歌地图之父跳槽 Facebook |
2 | 谷歌地图之父加盟 Facebook |
3 | 谷歌地图创始人拉斯加盟 Facebook |
建立倒排索引:
关键词 | 文档 ID 列表 |
---|---|
谷歌 | 1,2,3 |
地图 | 1,2,3 |
之父 | 1,2 |
加盟 | 2,3 |
1,2,3 |
当用户搜索 Facebook
,Elasticsearch 直接从索引中查找包含 Facebook
的文档 ID,返回搜索结果。
倒排索引的两个特点:
- 所有词项对应一个或多个文档 ID。
- 词项按照字典顺序存储,便于快速查找。
2. 倒排索引的优化
Elasticsearch 采用多种方法优化倒排索引,提高查询效率:
- 跳表(Skip List):在索引中添加跳跃指针,减少查询时的遍历开销。
- 布隆过滤器(Bloom Filter):快速判断某个 term 是否存在,减少不必要的磁盘 IO。
- 前缀压缩:相同前缀的词合并存储,减少索引大小,提高查找效率。
总结
- 写入数据时,Elasticsearch 先写入内存 buffer 和 translog,定期 refresh 让数据可搜索,commit 触发 flush 持久化数据,同时进行 segment merge。
- 查询数据时,可通过
doc_id
查询或全文搜索,搜索采用倒排索引来提高性能,并使用 query cache、index sorting 等优化查询效率。 - 倒排索引是 Elasticsearch 的核心数据结构,它将关键词映射到文档,支持高效的全文搜索,同时通过跳表、布隆过滤器、前缀压缩等方式优化性能。
理解这些原理后,你就不再把 Elasticsearch 当作黑盒,而是可以更深入地优化查询、调整参数,提升搜索性能!