Elasticsearch:如何对文档中的数值分段后执行排序?
Elasticsearch 按价格分段+分段内相关性排序实现方案
要实现你描述的先按价格分段(每10为一个区间)、再在分段内按相关性排序的需求,我们可以通过Elasticsearch的脚本字段结合多字段排序来完成,具体步骤如下:
1. 示例文档数据
首先确认你要处理的文档结构(和你提供的一致):
[ { "price" : "95", "relevance" : 5 }, { "price" : "105", "relevance" : 7 }, { "price" : "92", "relevance" : 3 }, { "price" : "82", "relevance" : 1 }, { "price" : "89", "relevance" : 9 } ]
2. 实现查询DSL
以下是完整的查询脚本,核心是通过自定义脚本生成分段标识,再结合多条件排序:
GET /your_index/_search { "query": { "match_all": {} }, "sort": [ { "_script": { "type": "number", "script": { "source": "Math.floor(Integer.parseInt(doc['price'].value) / 10)" }, "order": "desc" } }, { "relevance": { "order": "desc" } } ] }
3. 逻辑解释
- 分段标识生成:脚本中先将字符串类型的
price转为整数(Integer.parseInt(doc['price'].value)),再除以10并取整数部分(Math.floor(...)),得到每个文档的分段编号(比如105对应10,95对应9,89对应8)。 - 排序规则:
- 首先按生成的分段编号降序排列,确保高价格区间的文档优先展示;
- 在同一个分段内,按
relevance字段降序排列,让相关性更高的文档排在前面。
4. 预期查询结果
执行上述查询后,返回的文档顺序将和你预期的一致:
[ { "price" : "105", "relevance" : 7 }, { "price" : "95", "relevance" : 5 }, { "price" : "92", "relevance" : 3 }, { "price" : "89", "relevance" : 9 }, { "price" : "82", "relevance" : 1 } ]
内容的提问来源于stack exchange,提问作者Sahil Sharma
相关产品推荐
相关产品推荐

