Lucene中不包含指定term的查询是如何执行的?
field-x contains term1 but not term2类查询的索引访问逻辑 基础执行流程
这类查询属于Lucene的布尔组合查询范畴,对应BooleanQuery中MUST(term1) + MUST_NOT(term2)的规则组合,整个查询匹配阶段完全不需要访问stored字段,全部基于倒排索引的doc id集合运算完成:
- 首先在
field-x对应的倒排索引中,分别拿到term1和term2各自对应的有序doc id列表(倒排表) - 取
term1的doc id列表作为基础集合,此时已经筛选出所有包含term1的文档 - 对两个有序doc id集合做差集运算:遍历
term1的doc id列表,剔除所有同时出现在term2倒排表中的doc id,剩下的就是完全符合查询规则的文档id
Lucene的倒排表中doc id默认按升序排列,两个有序集合的差集运算效率极高,时间复杂度仅为O(n),全程无额外IO开销。
不需要访问stored字段的核心原因
stored字段的设计定位是存储文档的原始内容,仅在以下场景才会被读取:
- 查询命中后,需要返回对应字段的原始值给调用方
- 自定义脚本查询、自定义排序等依赖字段原始值的特殊查询逻辑
你提到的这类查询仅需要判断文档是否包含指定term,该类元信息已经完全存储在倒排索引结构中,没有任何需要读取stored字段的必要。
例外情况
如果你的查询请求额外指定了要返回field-x的原始内容,或者需要基于field-x的原始值做后续自定义处理,才会在得到命中doc id列表后,批量读取对应文档的stored字段。
内容的提问来源于stack exchange,提问作者kaykay
相关产品推荐
相关产品推荐

