Elasticsearch:bool与fuzzy查询在过滤/查询上下文的交互问题
Elasticsearch 6.0.0中Bool查询Must子句与独立Fuzzy查询结果一致的原因
首先得明确:你遇到的并不是异常现象,而是Elasticsearch查询上下文工作机制的正常表现。咱们一步步拆解:
1. 查询上下文 vs 过滤上下文的核心区别
Elasticsearch的查询分为两种核心上下文:
- 查询上下文:不仅判断文档是否匹配,还会计算每个匹配文档的相关性得分,用于结果排序。顶层的
query字段、bool的must/should子句都属于查询上下文范畴。 - 过滤上下文:只判断文档是否匹配,不计算得分,且会缓存匹配结果来提升重复查询的性能。
bool的filter/must_not子句属于过滤上下文。
2. 独立Fuzzy查询与Bool Must子句的上下文一致性
你执行的独立Fuzzy查询:
{ "query": { "fuzzy": { "firstName": { "value": "yvonne", "fuzziness": 1 } } } }
本质是在顶层查询上下文中执行Fuzzy匹配,ES会找出所有firstName与yvonne编辑距离≤1的文档,并计算每个文档的相关性得分。
而当你把这个Fuzzy查询放到bool的must子句中时:
{ "query": { "bool": { "must": [ { "fuzzy": { "firstName": { "value": "yvonne", "fuzziness": 1 } } } ] } } }
must子句同样处于查询上下文中,ES执行的逻辑和独立查询完全一致:匹配相同的文档集合,计算相同的相关性得分。既然匹配逻辑没有任何变化,命中结果自然不会有差异。
3. 若想看到上下文差异,可尝试过滤上下文
如果把Fuzzy查询放到bool的filter子句中,你会发现结果的命中数和之前一致,但返回的文档没有相关性得分(_score为0),且后续相同的过滤条件会被ES缓存:
{ "query": { "bool": { "filter": [ { "fuzzy": { "firstName": { "value": "yvonne", "fuzziness": 1 } } } ] } } }
总结一下:你误以为的“异常”其实是因为must子句和顶层查询共享相同的查询上下文,Fuzzy查询的匹配逻辑没有任何变化,所以结果完全一致。
内容的提问来源于stack exchange,提问作者wpb
相关产品推荐
相关产品推荐

