如何在Elasticsearch中按指定国家字段权重排序查询结果?
需求:按指定国家优先级排序Elasticsearch搜索结果
现有数据与查询
存储的数据
[ { "name" : "John Doe", "country" : "India" }, { "name" : "John Doe", "country" : "USA" } ]
当前搜索查询
当用户输入“John”时,使用以下查询匹配name包含John的文档:
{ "from": 0, "size": 10, "query": { "bool": { "must": [ { "query_string": { "query": "name:(John*)" } } ] } } }
当前查询结果
[ { "name" : "John Doe", "country" : "India" }, { "name" : "John William", "country" : "USA" }, { "name" : "John Smith", "country" : "Canada" }, { "name" : "John Lobo", "country" : "India" } ]
排序需求
需要让搜索结果按以下优先级排序:
- 来自India的文档排在最前面
- 其次是来自Canada的文档
- 最后是其他国家的文档
核心是为country=India和country=Canada的文档赋予不同权重,提升它们的搜索评分,从而改变排序顺序。
实现方案
使用bool查询结合should子句实现多值加权,must子句保证所有结果匹配name的基础条件,should子句为指定国家的文档额外加分:
{ "from": 0, "size": 10, "query": { "bool": { "must": [ { "query_string": { "query": "name:(John*)" } } ], "should": [ // 给India的文档最高权重 { "term": { "country.keyword": { "value": "India", "boost": 3 } } }, // 给Canada的文档次高权重 { "term": { "country.keyword": { "value": "Canada", "boost": 2 } } } ], // 确保不匹配should条件的文档也能被返回(由must条件保证) "minimum_should_match": 0 } } }
方案说明
must子句:作为基础查询条件,确保所有返回文档都满足name包含John的要求。should子句:通过两个term查询分别为India和Canada的文档设置不同boost值(数值越大权重越高),匹配的文档会获得额外评分加成。minimum_should_match: 0:保证即使文档不匹配任何should条件(比如来自USA的文档),只要满足must条件就会被返回,不会被过滤。
处理后,搜索结果会自动按评分从高到低排列:India的文档评分最高,其次是Canada,最后是其他国家的文档。
内容的提问来源于stack exchange,提问作者Kartik Patel
相关产品推荐
相关产品推荐

