检索精度与召回率排序问题:如何在相关结果内按评分排序?
问题解决:在Elasticsearch相关文档范围内按自定义条件排序
核心问题分析
你当前的match查询默认采用任意匹配逻辑:只要文档包含course或english其中一个词就会被召回。当按rating排序时,像course makeup这种仅含单个搜索词、但评分高的无关文档就会排在前列,不符合你对“相关文档”的预期。
下面提供两种针对性解决方案:
方案1:严格过滤出同时包含所有搜索词的文档(推荐)
通过给match查询添加minimum_should_match: 2参数,强制要求文档必须同时匹配course和english两个词,直接排除仅含单个词的无关文档,再在这个范围内按评分排序。
示例查询
GET idx_test/_search { "query": { "match": { "name": { "query": "course english", "minimum_should_match": 2 } } }, "sort": [ { "rating": { "order": "desc" } }, { "_score": { "order": "desc" } } ] }
执行结果
"hits": [ { "_index": "idx_test", "_id": "YgqH8YkBOnuUjQMmwaIc", "_score": 0.7777306, "_source": { "name": "course english mediujm", "rating": 4 }, "sort": [4, 0.7777306] }, { "_index": "idx_test", "_id": "YQqH8YkBOnuUjQMmwaIc", "_score": 0.7777306, "_source": { "name": "course english advance", "rating": 2 }, "sort": [2, 0.7777306] } ]
此方案完全符合你“仅在相关文档内排序”的需求,同时保留了所有同时匹配两个搜索词的潜在相关文档。
方案2:保留潜在相关文档但确保相关内容优先排序
如果需要召回仅含单个词的潜在相关文档,但不想让它们排在高评分的无关位置,可以用bool查询结合权重提升,让同时匹配两个词的文档获得更高的相关性得分,再将_score作为排序的前置条件,确保相关文档即使评分稍低也能排在前面。
示例查询
GET idx_test/_search { "query": { "bool": { "should": [ // 匹配两个词的文档,赋予高权重 { "match": { "name": { "query": "course english", "minimum_should_match": 2, "boost": 10 } } }, // 匹配任意一个词的文档,权重较低 { "match": { "name": "course english" } } ], "minimum_should_match": 1 } }, "sort": [ { "_score": { "order": "desc" } }, { "rating": { "order": "desc" } } ] }
此方案下,同时含两个词的文档会因为高权重的_score排在最前面,之后才是仅含单个词的文档,兼顾了召回范围和排序合理性。
内容的提问来源于stack exchange,提问作者rabbitbr
相关产品推荐
相关产品推荐

