2017-06-13 81 views
3

我有一个小的在线商店应用程序,我想根据它们的活动价格对商品进行排序。所以有一个正常的价格和可选的折扣价格。但折扣价格仅在一个时间范围内有效,折扣结束时索引不会更新。例如:基于多个领域和时间条件的Elasticsearch排序

{price: 2.00, discount:{price:1.10, start:2016-08-11, end:2016-09-14}} 

是否有可能在排序中包含这样的条件?目标是在任何给定时间确保正确的排序顺序。

编辑:目前ES版本相当老,但更新到最新不是问题。

+0

可以使用_script做到这一点,基本上,你将不得不自己编写一个脚本与排序将操作。我无法帮助您制作脚本请求,因为我从未使用_script选项,所以我不会将其作为答案发布,但您可以在此处找到更多信息: [基于脚本的排序](https:// www.elastic.co/guide/en/elasticsearch/reference/6.0/search-request-sort.html) – AlwaysGoingToAsk

+0

您在帖子中没有提供太多信息:“discount”字段,ES版本的映射是什么? –

回答

2

这是针对Elasticsearch 5和6(你没有提到,如我所说的那个版本和那个discount字段的映射)。另外,你需要,只要你运行该查询明确作为参数传递以毫秒为单位的当前日期和时间:

"sort": { 
    "_script": { 
     "type": "number", 
     "script": { 
     "lang": "painless", 
     "source": "if (doc['discount.price']!=null && doc['discount.start'].date.getMillis() < params['time'] && doc['discount.end'].date.getMillis() > params['time']) return doc['discount.price'].value; else return doc['price'].value", 
     "params": { 
      "time": 1512717897000 
     } 
     }, 
     "order": "desc" 
    } 
    } 
+2

只是一个OP的说明:在ES 6中,它警告:#!弃用:日期字段中不再需要getDate,因为该值现在是日期。您可以使用:'doc ['discount.start'] .value.getMillis()'而不是'doc ['discount.start']。date.getMillis()'。 –

+0

有趣。我不知道@ArchitSaxena。感谢您添加此评论。 –