按日期排序+在即将出现的结果之后显示过去的结果

时间:2020-07-13 03:04:32

标签: elasticsearch elasticsearch-6

在Elastic中,我想按start_date升序对结果进行排序,但过去的日期显示在即将到来的日期之后。

预期结果示例:

[
    {id: 5, start_date: '3000-01-01'},
    {id: 7, start_date: '3001-01-01'},
    {id: 8, start_date: '3002-01-01'},
    {id: 1, start_date: '1990-01-01'},
    {id: 4, start_date: '1991-01-01'},
    {id: 3, start_date: '1992-01-01'},
]

在SQL中可能会发生这种情况:

ORDER BY (start_date > NOW()) DESC, start_date ASC

但是我不确定如何在Elastic中完成此任务。我唯一能想到的就是每天设置一个布尔is_upcoming标志并重新编制索引。

我也可能会限制和分页搜索结果的数量,因此以相反的start_date顺序获取它们,然后在我的代码中处理结果并不是真的可行。

1 个答案:

答案 0 :(得分:1)

如果您的start_date的类型为date,并且其格式为yyyy-MM-dd(我发现YYYY-...无法正常工作),则完全可以使用sort script

GET future/_search
{
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "lang": "painless",
          "source": "return doc['start_date'].value.millis > params.now ? (doc['start_date'].value.millis - params.now) : Long.MAX_VALUE",
          "params": {
            "now": 1594637988236
          }
        },
        "order": "asc"
      }
    },
    {
      "start_date": {
        "order": "asc"
      }
    }
  ]
}

出于here所述的同步原因,需要参数化的now