Solr查询执行顺序疑问:模糊搜索与过滤查询的执行范围
Solr 8.9查询执行流程疑问
问题背景
已将CSV文件索引至Solr 8.9,包含food、color及其他字段。food与color字段的fieldType均为text_general,multivalued设为false,已配置为索引并存储。当前共索引2000万份文档,color字段有20个不同取值,其中100万份文档的color字段值为white。
执行的查询命令:
curl -G http://localhost:8983/solr/QueryPerformenceCore/select --data-urlencode "q=(food:'cheese~' OR food:'paneer~' OR food:'milk~')" --data-urlencode "fq=color:white"
用户疑问
上述查询中,food字段的模糊搜索是在100万份文档上执行,还是先在2000万份文档上执行模糊搜索再执行color:white的过滤查询?该查询的具体执行流程是怎样的?
解答
是先执行fq=color:white的过滤,再在过滤后的100万文档上执行food字段的模糊搜索,具体执行流程如下:
优先处理过滤查询(fq)
Solr会优先执行color:white过滤逻辑。由于color是低基数字段(仅20个不同取值),Solr会对这类字段做索引优化,能快速定位到所有color为white的100万文档,生成一个紧凑的文档ID集合(位集)。这个操作时间成本极低,无需遍历全量文档。在过滤范围内执行主查询(q)的模糊搜索
基于第一步得到的100万文档集合,Solr会对food字段执行三个模糊查询的逻辑或操作:
- 分别为
cheese~、paneer~、milk~生成对应编辑距离范围内的候选关键词; - 在
food字段的索引中查找这些候选词匹配的文档; - 将这些匹配文档与第一步的过滤文档集做交集,最终得到同时满足过滤条件和主查询条件的文档。
- 后续结果处理
对最终匹配的文档进行默认得分排序(或指定排序规则)、分页处理后,返回查询结果。
补充说明
Solr的查询优化器会自动选择最优执行顺序——优先通过过滤查询缩小文档范围,能大幅减少主查询需要处理的数据量,显著提升整体查询性能。尤其是针对color这类低基数字段,过滤操作效率极高,优先过滤是必然的优化选择。
内容的提问来源于stack exchange,提问作者user752590
相关产品推荐
相关产品推荐

