请解释Elasticsearch中的倒排索引是如何工作的?

提问者:帅平 问题分类:面试刷题
请解释Elasticsearch中的倒排索引是如何工作的?
1 个回答
宁愿短发披肩
宁愿短发披肩
倒排索引的整个工作过程如下:
一、倒排索引的核心组成:词典与倒排列表
​词典(Term Dictionary)​​:存储所有文档中出现过的词项(如“搜索引擎”“倒排索引”等),并按字典序排序。Elasticsearch基于Lucene实现,实际使用FST(有限状态Transducer)​优化词典存储——FST通过压缩前缀共享的方式,既能快速查找词项是否存在,又能减少内存占用(例如,词项“apple”和“app”会共享前缀“app”的存储)。
​倒排列表(Posting List)​​:每个词项对应一个倒排列表,记录包含该词项的文档ID集合,以及扩展元数据(如词频TF、词项在文档中的位置、偏移量等)。例如,词项“Elasticsearch”可能对应倒排列表[doc1, doc2],其中doc1的位置是第3个词,doc2的位置是第1个词。
二、倒排索引的构建过程
分词(Tokenization)​​:文档写入时,Elasticsearch使用指定的分词器(如标准分词器、IK分词器)将文本拆分为词项。例如,文档“倒排索引是Elasticsearch的核心技术”会被分词为["倒排索引", "是", "elasticsearch", "的", "核心技术"](假设分词器忽略停用词“是”“的”)。
​生成映射关系​:对每个词项,记录其出现的文档ID,并补充元数据(如词频:该词项在文档中出现的次数;位置:词项在文档中的顺序位置,用于短语查询“倒排索引 核心技术”)。最终形成“词项→{文档ID列表+元数据}”的映射。
三、倒排索引的优化机制
段(Segment)合并​:索引数据会被拆分为多个独立的段(Segment,类似Lucene的分段机制),每个段是自包含的倒排索引。随着数据写入,旧段会被合并为更大的段(如合并两个小段为一个中段),减少索引碎片,提升查询时的IO效率。
​元数据压缩​:倒排列表中的文档ID通常采用差值编码(如文档ID序列[100, 102, 105]存储为[100, 2, 3]),结合前缀压缩减少空间占用;词频和位置信息通过变长整数(如VarInt)编码存储。
发布于:2天前 IP属地:四川省
我来回答