Ответ 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.