Да, это возможно в ElasticSearch с использованием скрипта либо для сортировки, либо для оценки.
Я бы предпочел сценарий оценки, потому что «оценка на основе сценария» будет быстрее (согласно документации).
Используя сценарий оценки, вы можете использовать временную метку Unix для поля даты типа int/long
и сценарий сортировки mvel в запросе custom_score
. Возможно, вам придется переиндексировать ваши документы. Вам также необходимо иметь возможность конвертировать искомое время в временную метку Unix, чтобы прокачать его в ElasticSearch.
Затем сценарий сортировки будет вычитать запрошенную временную метку из временной метки каждого документа и получать абсолютное значение. Затем результаты сортируются в порядке возрастания — наименьшее «расстояние» является лучшим.
Таким образом, при поиске документов, датированных около года назад, это будет выглядеть примерно так:
"query": {
"custom_score" : {
"query" : {
....
},
"params" : {
"req_date_stamp" : 1348438345,
},
"script" : "abs(doc['timestamp'].value - req_date_timestamp)"
}
},
"sort": {
"_score": {
'order': 'asc'
}
}
(Извините за любые ошибки в моем JSON - я тестировал эту идею в pyes
)
Возможно, вам придется настроить это, чтобы получить правильное округление — например, в вашем вопросе упоминаются совпадающие дни, поэтому вы можете округлить генератор меток времени до ближайшего дня.
Для получения полной информации вы можете проверить документы Custom Score Query и перейдите по ссылке на скрипты MVEL.
person
jamesc
schedule
25.09.2013