Elasticsearch 2.4脚本排序报错,求非脚本实现价格降幅排序方案
解决方案
方案一:索引时预处理差值字段(推荐)
在文档写入Elasticsearch前,提前计算oldprice与price的差值,新增一个price_drop字段(命名可自定义)存储该值,后续查询直接按这个字段排序即可,这是性能最优的方案。
步骤:
- 更新索引映射,添加
price_drop字段(类型与price/oldprice一致,比如float或double):
{ "mappings": { "your_doc_type": { "properties": { "price": {"type": "float"}, "oldprice": {"type": "float"}, "price_drop": {"type": "float"} } } } }
- 写入文档时计算差值:
在Symfony处理数据环节,计算$priceDrop = $oldPrice - $price,将该值存入price_drop字段后再索引到Elasticsearch。 - 查询时按
price_drop降序排序:
要找出降幅最大的商品,需按差值从大到小排序,查询语句如下:
{ "sort": [ { "price_drop": {"order": "desc"} } ] }
补充:原脚本报错的原因(非脚本方案可忽略)
Elasticsearch 2.4默认禁用了inline脚本,若要继续使用原脚本方式,需修改elasticsearch.yml配置文件,开启inline脚本支持:
script.inline: on script.indexed: on
同时注意原排序方向错误——要找降幅最大的商品,应将order设为desc而非asc,修正后的脚本排序语句:
"sort": { "script": { "inline": "doc['oldprice'].value - doc['price'].value" }, "order": "desc" }
内容的提问来源于stack exchange,提问作者Ronald_Zp
相关产品推荐
相关产品推荐

