Elasticsearch查询结果未按A-Z排序,如何配置实现期望的排序效果?
Elasticsearch默认返回结果按相关性得分_score降序排列,所以你当前的结果是得分高的文档在前,要实现你需要的排序效果,可按以下步骤调整:
前置检查
首先确认你的索引映射中,name和name_mn字段存在未分词的keyword类型属性:如果字段是text类型,默认映射会自动生成name.keyword子字段用于聚合、排序操作;如果字段本身就是keyword类型可直接使用。如果没有对应keyword类型字段,需要先修改索引映射后重建数据。
调整后的查询语句
你期望优先展示name以m开头的匹配结果、该类结果按相关性+字母序排列,剩余匹配结果按原相关性降序排列,可使用function_score加自定义排序实现,完整查询如下:
{ "query": { "function_score": { "query": { "multi_match": { "query": "m*", "fields": ["name", "name_mn"], "type": "phrase_prefix", "max_expansions": 50, "operator": "and" } }, "functions": [ { "filter": { "prefix": { "name.keyword": "m" } }, "weight": 10 } ], "boost_mode": "sum" } }, "sort": [ { "_score": { "order": "desc" } }, { "name.keyword": { "order": "asc", "case_insensitive": true } } ] }
规则说明
- 这里通过
function_score给所有name以m开头的文档额外加10分权重,保证这类文档优先级远高于其他匹配结果,排在最前面。 - 排序规则第一优先级为得分降序,第二优先级为name字段字母升序,7.10以上版本支持
case_insensitive参数忽略大小写排序,避免大写字母默认排在小写前的问题。 - 如果你需要同时判断
name_mn字段的前缀匹配,可在filter中添加bool条件,匹配name或者name_mn的前缀即可。
内容的提问来源于stack exchange,提问作者user1317748
相关产品推荐
相关产品推荐

