Elasticsearch如何为同一字段不同值设置不同得分调整排序
解决Elasticsearch不同type_id的得分加权问题
方法一:在bool查询的should子句中添加type_id加权
直接在现有should里加两个针对type_id的匹配查询,给type_id=9设置更高的boost值,这样当display_name和description匹配度相同时,type_id=9的文档会因为额外的得分加成排名更靠前。
修改后的查询语句:
{ "query":{ "bool":{ "must":[ {"terms":{"type_id":[9,10]}} ], "should":[ {"match":{ "display_name":{"query":"keyword","boost":10}}}, {"match":{ "description":{"query":"keyword","boost":2}}}, {"match":{ "type_id":{"query":9,"boost":5}}}, // 给type_id=9加更高权重 {"match":{ "type_id":{"query":10,"boost":1}}} // type_id=10权重较低 ], "minimum_should_match": 1 // 可根据业务需求调整,确保至少匹配一个should子句 } } }
原理:bool查询的should子句会累加每个匹配项的得分,给type_id=9更高的boost值,就能让它的总得分超过type_id=10的文档(当其他匹配项得分相同时)。
方法二:使用function_score查询(更灵活的权重控制)
如果需要更精细化的得分控制,用function_score可以直接给特定type_id设置固定权重,不会干扰其他匹配项的得分计算逻辑。
示例查询:
{ "query": { "function_score": { "query": { "bool": { "must": [{"terms": {"type_id": [9, 10]}}], "should": [ {"match": {"display_name": {"query": "keyword", "boost": 10}}}, {"match": {"description": {"query": "keyword", "boost": 2}}} ] } }, "functions": [ { "filter": {"term": {"type_id": 9}}, "weight": 5 // 给type_id=9的文档额外加5分权重 }, { "filter": {"term": {"type_id": 10}}, "weight": 1 // type_id=10的文档额外加1分 } ], "score_mode": "sum" // 原始查询得分加上function的权重得分 } } }
原理:先执行你原来的bool查询得到基础得分,再对匹配特定type_id的文档加上对应权重分,最终总得分是基础得分加权重分,以此保证type_id=9的文档得分更高。
你可以根据实际需求调整boost或weight的数值,比如想拉大差距,就把type_id=9的权重设为10,type_id=10的设为0.5。
内容的提问来源于stack exchange,提问作者xrui
相关产品推荐
相关产品推荐

