Elasticsearch中must包裹constant_score未返回预期结果的原因
Elasticsearch bool查询should改must后无匹配文档的原因
当使用以下Elasticsearch查询时,外层bool的should子句能正确返回winnerAthlete-A(得分5.0)和winnerAthlete-B(得分4.0)两个文档:
{ "query": { "bool": { "should": [ { "constant_score": { "boost": 5, "filter": { "bool": { "must": [ { "ids": { "values": [ "winnerAthlete-A" ] } }, { "dis_max": { "queries": [ { "bool": { "filter": { "term": { "isAthlete": true } } } }, { "bool": { "filter": { "term": { "isWinner": true } } } } ] } } ] } } } }, { "constant_score": { "boost": 4, "filter": { "bool": { "must": [ { "ids": { "values": [ "winnerAthlete-B" ] } }, { "dis_max": { "queries": [ { "bool": { "filter": { "term": { "isAthlete": true } } } }, { "bool": { "filter": { "term": { "isWinner": true } } } } ] } } ] } } } } ] } } }
但将外层bool查询中的should改为must后,查询未匹配到任何文档,核心原因如下:
must子句要求所有条件同时匹配同一文档:外层bool的must会强制数组内的所有子查询都命中同一个文档。而你的两个constant_score子查询分别针对不同的文档ID(winnerAthlete-A和winnerAthlete-B),没有任何文档能同时拥有这两个ID,因此无法返回结果。should子句的逻辑是满足任一条件即可:使用should时,文档只要匹配数组中的任意一个子查询就会被返回,因此winnerAthlete-A匹配第一个子查询、winnerAthlete-B匹配第二个子查询,二者都能正常返回并获得对应的boost得分。
补充说明:每个constant_score内部的must逻辑是正常的——要求文档同时匹配指定ID和dis_max中的任一过滤条件,但外层改成must后,相当于要求文档同时满足两个完全不同的ID条件,这在逻辑上不可能实现,所以最终无匹配结果。
内容的提问来源于stack exchange,提问作者acharp
相关产品推荐
相关产品推荐

