Elasticsearch通过倒排索引实现毫秒级全文检索:先经Analyzer分词查词典定位倒排列表,再解压获取文档ID及位置信息,接着多词项布尔运算合并结果,然后用BM25公式基于TF/IDF等评分排序,最后通过正排索引加载原文并高亮。

当您向Elasticsearch发起一个全文查询请求时,系统并非逐条扫描所有文档进行匹配,而是直接利用预构建的倒排索引结构快速定位目标文档。这种机制是Elasticsearch实现毫秒级响应的核心所在。以下是倒排索引在查询过程中实际运作的关键环节:
一、词项解析与词典查找
查询字符串首先被送入Analyzer进行标准化处理,包括分词、小写转换、停用词过滤等步骤,生成一组规范化的词项(Term)。随后,Elasticsearch在内存中加载的词项索引(Term Index)中执行前缀查找或二分搜索,快速定位到词项在词项字典(Term Dictionary)中的物理偏移位置。
1、将用户输入的查询语句"elasticsearch inverted index"送入标准分析器standard analyzer。
2、输出三个规范化词项:"elasticsearch"、"inverted"、"index"。
3、对每个词项,在Term Index中查找其在Term Dictionary中的起始地址。
4、根据地址跳转至Term Dictionary,读取该词项对应的倒排列表指针。
二、倒排列表获取与解压
词项字典中存储的并非完整倒排列表,而是一个指向磁盘上压缩倒排数据块的指针。Elasticsearch依据该指针读取对应段(Segment)中的倒排文件,并使用如FOR(Frame of Reference)编码或RLE(Run-Length Encoding)等算法实时解压,还原出原始文档ID序列及附加元数据(TF、Position、Offset)。
1、从Segment_001的.fdt文件中定位到"index"词项的倒排数据块。
2、读取压缩后的文档ID差分序列:[1, 3, 2, 5]。
3、执行差分解码,得到绝对文档ID:[1, 4, 6, 11]。
4、同步解压并加载各文档中"index"出现的位置信息(如[2, 8]表示第2和第8个token位置)。
三、多词项布尔运算与结果合并
对于含多个查询词的语句(如"elasticsearch AND index"),Elasticsearch分别获取各词项的倒排列表后,在内存中执行集合运算。AND操作对应交集计算,OR操作对应并集,NOT操作对应补集。运算过程采用跳跃指针(Skip List)加速遍历,避免线性扫描整个列表。
1、获取"elasticsearch"的文档ID列表:[1, 2, 3, 5, 7]。
2、获取"index"的文档ID列表:[2, 4, 5, 6, 11]。
3、启动双指针归并算法,比较两列表元素:当指针分别指向2和2时匹配成功;继续推进至5和5再次匹配。
4、输出交集结果:[2, 5]作为初步命中文档集。
四、相关性评分与排序
命中文档ID列表仅是中间结果。Elasticsearch进一步读取各文档的字段长度、词频(TF)、逆文档频率(IDF)、字段权重等信息,代入BM25评分公式计算相关性得分。该过程在倒排列表中已预存的TF和文档长度信息支持下完成,无需回查原始文档内容。
1、对文档2,读取"elasticsearch"的TF值(假设为4)、字段总token数(假设为120)。
2、查询全局词频统计,获取"elasticsearch"在全部文档中的DF值(假设为187)。
3、结合索引配置的k1=1.2、b=0.75参数,代入BM25公式计算初始得分。
4、若查询含多个词项,对各词项得分加权求和,生成最终排序依据。
五、原始文档加载与高亮渲染
经排序后的前N个文档ID被提交至协调节点,触发Fetch阶段。此时系统不再依赖倒排索引,而是通过正排索引(Doc Values 或 _source 字段)直接读取原始JSON内容。若启用高亮,系统依据倒排列表中存储的Offset位置信息在原文本中标记匹配片段。
1、根据文档ID 2,从_segment_001.doc文件中读取存储的_source JSON对象。
2、提取"content"字段原始文本:"Elasticsearch uses an inverted index for fast search..."。
3、调用highlighter模块,依据"index"词项的Offset [18, 23]区间,在文本中包裹标签。
4、返回包含高亮HTML片段的响应体。

















