Elasticsearch查询时如何获取同一文档各match子句的单独得分
解决方案
可以通过命名查询+Painless脚本字段的方式实现需求,该方案性能损耗极低,返回结果结构清晰,无需解析复杂的explain内容。
实现逻辑
- 给每个
match子句添加_name参数,为每个子句设置唯一标识 - 通过Painless脚本内置的
_scoreFor()函数,直接提取指定命名子句的匹配得分,作为单独字段返回
示例查询
{ "query": { "bool": { "should": [ { "match": { "name": { "query": "john", "_name": "name_match" } } }, { "match": { "company": { "query": "john", "_name": "company_match" } } }, { "match": { "email": { "query": "john", "_name": "email_match" } } } ] } }, "script_fields": { "name_match_score": { "script": { "lang": "painless", "source": "return _scoreFor('name_match');" } }, "company_match_score": { "script": { "lang": "painless", "source": "return _scoreFor('company_match');" } }, "email_match_score": { "script": { "lang": "painless", "source": "return _scoreFor('email_match');" } } } }
返回结果说明
每个命中文档的fields字段下会返回三个独立的得分字段,分别对应name、company、email三个字段的匹配得分,原有文档的整体得分不受影响。
注意事项
_scoreFor()函数需要Elasticsearch 7.10及以上版本支持,如果使用更低版本,可以通过遍历查询匹配标识手动映射得分,实现逻辑类似。- 该方案的额外计算开销极小,查询效率和原生查询几乎一致。
内容的提问来源于stack exchange,提问作者Ahmad Nabil
相关产品推荐
相关产品推荐

