Условная сортировка в ElasticSearch

У меня есть некоторые документы, которые я хотел бы отсортировать в поле даты. Для документов с датой, равной указанной дате, примеру сегодня, и всем датам после этого я хотел бы сортировать по возрастанию. Для дат до указанной даты я хотел бы сортировать по убыванию.

Возможно ли это в ElasticSearch? Если бы вы могли предложить какую-либо литературу или подход.

дата имеет тип "дата" и формат "dateOptionalTime".

Спасибо

Ответ 1

Да, это возможно в ElasticSearch, используя script, либо для сортировки, либо для подсчета очков.

Мое предпочтение было бы для скоринга script, потому что "оценка w372 > будет быстрее (согласно документации).

Используя скоринг script, вы можете использовать временную метку Unix для поля даты типа int/long и сортировки mvel script в запросе custom_score. Возможно, вам потребуется переиндексировать ваши документы. Вам также необходимо будет преобразовать искомое время в временную метку Unix, чтобы прокачать ее в ElasticSearch.

Сортировка script затем вычитает запрошенную метку времени из каждой метки времени документа и делает абсолютное значение. Затем результаты сортируются в порядке возрастания - самое низкое "расстояние" - лучшее.

Поэтому при поиске документов, датированных около года назад, это выглядело бы примерно так:

"query": {
    "custom_score" : {
        "query" : {
            ....
        },
        "params" : {
            "req_date_stamp" : 1348438345,
        },
        "script" : "abs(doc['timestamp'].value - req_date_timestamp)"
    }
},
"sort": {
    "_score": {
        'order': 'asc'
    }
}

(Извиняюсь за любые ошибки в моем JSON - я протестировал эту идею в pyes)

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

Для "полной" информации вы можете проверить Документы пользовательского запроса оценки и перейти по ссылке на скрипты MVEL.

Ответ 2

Для такого рода конкретных случаев использования вы должны использовать сортировку script.

См. раздел "script сортировка на основе" на странице Сортировка документации.