Найти полную дату, а не только год (Elasticsearch)
В обычной ситуации у меня есть дата заполнения, но для некоторых записей у меня есть даты в формате гггг / гггг-ММ. И в результатах поиска я не хочу дат, которые имеют только год.
Определение структуры:
[premiere_date] => Array
(
[type] => date
[format] => dd.MM.yyyy||MM.yyyy||yyyy||yyyy-MM-dd
)
Пример данных:
{'name': 'a', 'premiere_date': '1984-11-22'},
{'name': 'b', 'premiere_date': '1984-12'},
{'name': 'c', 'premiere_date': '1985'},
В результате я хочу:
{'name': 'a', 'premiere_date': '1984-11-22'},
{'name': 'b', 'premiere_date': '1984-12'},
Я пытался добавить формат для фильтра диапазона, но это не работает
{
"query": {
"bool": {
"filter": [
{
"range": {
"premiere_date": {
"gte": "1983-12-22",
"lt": "1988-03-21",
"format": "yyyy-MM-dd"
}
}
}
]
}
}
}
1 ответ
Решение
Elasticsearch преобразует значения "date"
тип данных - длинное число, представляющее миллисекунды с начала UTC. Это представление, которое индексируется и ищется. Таким образом, Elasticsearch неявно знает, что исходное значение даты из исходного документа имеет только год. Ваше приложение должно добавить другое поле, представляющее разрешение даты, и поиск должен также фильтровать по этому полю. Например,
{
"query": {
"bool": {
"filter": {
"range": {
"premiere_date": {
"gte": "1983-12-22",
"lt": "1988-03-21"
}
}
},
"must_not": {
"term": {
"premiere_date_resolution": "year"
}
}
}
}
}