ElasticSearch Rails: сортировка по дате1, если она есть, и в будущем, иначе сортировка по дате2 - PullRequest
1 голос
/ 13 апреля 2020

enter image description here

Выше приведены две разные записи из модели Posts, которые мы сохранили вasticsearch. Мы пытаемся добавить логи c, которые будут помещать наши липкие сообщения в ленту, как обычные сообщения после истечения срока их действия.

Мы хотим, чтобы оно говорило

"Если is_sticky И stickied_until в будущем сортируется по stickied_until, иначе сортируется по created_at "

Я думаю, что он работает в SQL (так как мы храним большую часть данных там и только доступные для поиска поля в ES), которые выглядят как

ORDER BY
  CASE
  WHEN stickied_until >= '#{DateTime.now.utc}'
  THEN stickied_until
  ELSE created_at
END DESC

, но есть две вещи, управляющие сортировкой, которые, я уверен, вызовут ошибки, а также просто будут ошибаться.

Можно ли сделать такую ​​условную сортировку в ES?

1 Ответ

1 голос
/ 13 апреля 2020

Для этого вам потребуется использовать скрипт сортировки.

{
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": {
          "lang": "painless",
          "source": """
            def is_sticky = doc['is_sticky'].value;
            def created_at = doc['created_at'].value.getMillis();
            if (!is_sticky) {
              return created_at;
            }

            def stickied_until =  doc['stickied_until'].value.getMillis();
            def now = params['now'];

            if (is_sticky && stickied_until > now) {
              return stickied_until;
            }

            return created_at;
          """,
          "params": {
            "now": 1586798403888
          }
        },
        "order": "desc"
      }
    }
  ]
}

Обратите внимание, что я использовал постоянную времени запроса params['now'] по причинам, указанным в документах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...