Сортировать по дате + показывать прошлые результаты после предстоящих - PullRequest
1 голос
/ 13 июля 2020

В Elasti c Я хотел бы отсортировать результаты по 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

Но я не уверен, как сделать sh это в Elasti c. Единственное, что я могу придумать, - это установить логический флаг is_upcoming и переиндексировать его каждый день.

Также я мог бы ограничивать и разбивать на страницы количество результатов поиска, поэтому получаю их в обратном порядке start_date упорядочить, а затем манипулировать результатами в моем коде на самом деле нереально.

1 Ответ

1 голос
/ 13 июля 2020

Это вполне возможно с помощью скрипта сортировки , если ваш start_date имеет тип date и его формат yyyy-MM-dd (я обнаружил, что 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 необходим для синхронизации, как описано здесь .

...