使用weakAnd查询array<string>属性时为何未获预期排序结果?
问题描述
我有一个包含以下两个字段的文档配置:
field label type string { indexing: summary | index | attribute index: enable-bm25 attribute: fast-search } field titles type array<string> { indexing: index | summary | attribute index: enable-bm25 attribute: fast-search }
对应的排序配置如下:
rank-profile profile { first-phase { expression: max(textSimilarity(label),elementSimilarity(titles)) } }
我的需求是召回满足以下任一条件的文档:
- 字段
label同时包含“Hot”和“Springs”两个词 - 字段
titles数组中的某一个元素同时包含“Hot”和“Springs”两个词
预期排名第一的文档为:(该文档的label恰好包含两个目标词)
{ "label": "Hot Springs", "titles": [] }
我执行了如下查询:
select * from DOC_NAME where weakAnd (label contains "Hot", label contains "Springs", titles contains "Hot", titles contains "Springs")
但上述预期文档甚至未出现在前10条结果中。
若将查询中的weakAnd替换为OR,结果符合预期:
select * from DOC_NAME where label contains "Hot" OR label contains "Springs" OR titles contains "Hot" OR titles contains "Springs"
此时预期文档会作为TOP结果返回。
即使使用如下查询,预期文档也能成为TOP结果:
select * from DOC_NAME where weakAnd (label contains "Hot", label contains "Springs") OR weakAnd( titles contains "Hot", titles contains "Springs")
为什么用weakAnd组合所有四个条件时,无法将预期文档列为TOP结果?
原因解析
问题核心在于weakAnd的工作逻辑:
weakAnd并非宽松版的“或”,它的本质是优先召回匹配条件数量更多的文档,所有条件都会参与评分计算。文档匹配的条件越多,得分越高,排名越靠前。- 你的预期文档中
titles是空数组,完全不满足titles contains "Hot"和titles contains "Springs"这两个条件,所以它只匹配了4个条件中的2个。 - 而其他文档可能匹配更多条件(比如某文档的
label包含一个词,titles里包含两个词,总共匹配3个条件;或者某文档的titles元素同时包含两个词,再加上label包含其中一个,匹配3个条件),这些文档的得分会超过只匹配2个条件的预期文档,导致它被挤到后面,甚至排不到前10。
反观另外两种可行的查询:
- 用
OR的查询:只要满足任意一个条件就会被召回,预期文档的label完全匹配两个目标词,textSimilarity(label)的得分远高于其他只匹配单个词的文档,因此排名第一。 - 两个
weakAnd加OR的查询:第一个weakAnd的条件正好命中预期文档(label同时包含两个词),满足这个子条件的文档会被召回,再加上排序逻辑取textSimilarity(label)的最大值,预期文档的得分最高,自然排第一。
总结:把四个条件放进同一个weakAnd时,预期文档因缺少titles相关条件的匹配,得分被其他匹配更多条件的文档超越,所以无法进入前列。
内容的提问来源于stack exchange,提问作者teovob
相关产品推荐
相关产品推荐

