https://blog.csdn.net/njpjsoftdev/article/details/54015485
个人基于上文链接进行一个个人的重点总结,供大家参考。
一、Lucene
- 1、索引构成:
前缀和后缀 + 倒排表 ,形成有向无环图
- 2、索引结构:FST(最小有向无环图)
eg:北京 北京天安门 ——》 北京2天安门 (相同前缀,只记offset偏移量,减少空间)
- 3、倒排索引解释:
文章包含词,是正排。
词到文章是倒排。
- 4、倒排表结构:
特点:数据压缩、跳跃表加速合并
- 5、Lucene列式存储DocValues(ES的聚合原理)
二、ES查询原理
**普通匹配查询:**排索引能够解决从词到文档的快速映射, 倒排索引
**ES的聚合查询:**分类、排序、数学计算等聚合操作时需要文档号到值的快速映射,Lucene列式存储DocValues
eg:
select gender,count(*),avg(age) from employee where dept='sales' group by gender
ES基于倒排索引和DocValues实现上述SQL的。
1. 从倒排索引中找出销售部门的倒排表。
2. 根据倒排表去性别的DocValues里取出每个人对应的性别,并分组到Female和Male里。
3. 根据分组情况和年龄DocValues,计算各分组人数和平均年龄
4. 因为ElasticSearch是分区的,所以对每个分区的返回结果进行合并就是最终的结果。
**注意:**因为单点内存聚合,所以每个分区不可能返回所有分组统计信息,只能返回部分,汇总时就会导致最终结果不正确