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

Sort by date + show past results after upcoming results

在 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 顺序获取它们,然后在我的代码中处理结果并不可行。

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

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"
      }
    }
  ]
}

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