图解 ElasticSearch 搜索原理 自编总结
- 集群、Node节点、分片、index、Lucene、Segment、【数据结构】
- 集群里的盒子代表一个节点——Node
- 节点中的绿色小分片Shard组合在一起形成一个ElasticSearch的索引。
- 每个shard都有副本信息replica
- 一个ElasticSearch的Shard本质上是一个Lucene,Lucene是一个Full Text 搜索库
- Lucene里面有很多小的segment,我们可以把它们看成Lucene内部的mini-index。
- Segment内部 有着许多数据结构
- Inverted Index:倒排索引【频率,页码】
- Stored Fields【键值对结构、存储整个文件的JSON source】
- Document Values【列式的存储,对于同一数据类型字段有会优化,针对排序、聚合】
- Cache【Lucene也会将所有的信息做缓存,这大大提高了它的查询效率。定期(每秒)刷新这些数据,然后这些文件就可以被搜索到。增加文件可能会使索引所占空间变小,它会引起merge,从而可能会有更多的压缩。会将这些segment合并,在这个过程中,segment会最终被删除掉】
-
节点分配与Shard优化
- 为更重要的数据索引节点,分配性能更好的机器
- 确保每个shard都有副本信息replica
- 路由Routing,每个节点,每个都存留一份路由表,所以当请求到任何一个节点时,ElasticSearch都有能力将请求转发到期望节点的shard进一步处理。请求分发。这个请求可能被分发到集群里的任意一个节点
- 这时这个节点就成为当前请求的协调者(Coordinator),它决定:
- 根据索引信息,判断请求会被路由到哪个核心节点
- 以及哪个副本是可用的
- 这时这个节点就成为当前请求的协调者(Coordinator),它决定:
- 在真实搜索之前 ,ElasticSearch 会将Query转换成Lucene Query,对于Filter条件本身也会有缓存,但queries不会被缓存,所以如果相同的Query重复执行,应用程序自己需要做缓存。所以,filters可以在任何时候使用,query只有在需要score的时候才使用