Elasticsearch:按review_rating排序时如何置顶指定产品
解决方案:指定产品置顶+按评分排序
当然可以实现,不过你当前的脚本里有个问题:priority变量未定义,直接运行会报错。下面给你两种可行的修改方案:
方案一:直接修改排序规则(推荐)
不需要改动查询部分,直接在sort里增加一个脚本排序字段,把指定产品优先排在前面,之后再按review_rating降序排列:
GET products/_search { "query": { "match_all": {} }, "sort": [ { "_script": { "type": "number", "script": { "source": "params.top_product_ids.contains(doc['product_id'].value) ? 1 : 0", "params": { "top_product_ids": ["abc-xyz", "dfgh-rt"] } }, "order": "desc" } }, { "review_rating": { "order": "desc" } } ] }
原理:给指定产品标记为1,其他产品标记为0,降序排序后标记为1的产品会排在最前面,同一组内再按评分高低排序。
方案二:通过function_score调整得分后排序
如果你想保留function_score的逻辑,可以修正脚本并调整排序规则为按查询得分降序,同时保留评分排序作为次要规则:
GET products/_search { "query": { "function_score": { "query": { "match_all": {} }, "boost_mode": "sum", "functions": [ { "script_score": { "script": { "source": """ double boost = 0; if (params.top_product_ids.contains(doc['product_id'].value)) { // 给置顶产品设置一个远高于普通评分的权重,确保排在前列 boost = 1000; } // 叠加原有评分,保证置顶产品内部也按评分排序 return boost + doc['review_rating'].value; """, "lang": "painless", "params": { "top_product_ids": ["abc-xyz", "dfgh-rt"] } } } } ] } }, "sort": [ { "_score": { "order": "desc" } }, { "review_rating": { "order": "desc" } } ] }
原理:给置顶产品添加一个超大的基础得分,让它们的总得分远高于其他产品,按总得分降序后自然置顶,同时同一组内仍按评分高低排序。
内容的提问来源于stack exchange,提问作者dtrix legend
相关产品推荐
相关产品推荐

