Мы выполняем такой запрос Elasticsearch, используя PHP API:
$params = [
//please ignore the variables below,
//we made it in dynamic parameter-based in our function,
//that's why they're variables
'index' => $ourIndex,
'type' => $ourType,
'from' => $from,
'size' => $page_size,
'body' => [
"query" => [
'bool' => [
'must' => [
[
"query_string" => [
"default_field" => $content,
"query" => "$keywords"
]
],
[
"range" => [
"@timestamp" => [
"from" => $parseParams['pub_date_start'],
"to" => $parseParams['pub_date_end'],
'format' => "yy-MMM-dd'T'HH:mm:ss.SSS'Z'",
]
]
]
]
]
]
]
];
Приведенный выше запрос работает с нашим полем @timestamp, потому что его тип — date.
"@timestamp" : {
"type" : "date"
}
И примерное значение выглядит следующим образом:
"@timestamp" : "2019-06-17T16:53:55.778Z"
Однако мы хотим настроить таргетинг на наше поле pub_date в нашем индексе, и в его отображении поле имеет тип long
"pub_date" : {
"type" : "long"
},
поэтому он имеет такие значения, когда мы отображаем документы:
"pub_date" : 1510358400
Когда мы изменили приведенный выше запрос на target вместо @timestamp на pub_date, теперь он отображает такую ошибку:
Пробные решения
Я попытался добавить дополнительный формат epoch_millis в свойство format:
[
"range" => [
"pub_date" => [
"from" => $parseParams['pub_date_start'],
"to" => $parseParams['pub_date_end'],
'format' => "yyyy-MM-dd||yy-MMM-dd'T'HH:mm:ss.SSS'Z'||epoch_millis",
]
]
]
Но все равно не получается
Главный вопрос
Я чувствую, что значения в формате Unix не могут быть распознаны запросом range Elasticsearch, поэтому запрос не выполняется. Есть ли обходной путь для этого без изменения ОТОБРАЖЕНИЯ индекса?
Потому что другие возможные решения предлагали изменить сопоставление, но у нас уже есть около 25 миллионов документов в индексе, поэтому мы подумали, что форматирование в PHP будет более удобным подходом.






Поскольку поле имеет тип long и хранит метку времени unix, просто преобразуйте дату в $parseParams['pub_date_start'] и $parseParams['pub_date_end'] в метку времени unix, используя стртотайм. Обновите запрос диапазона, как показано ниже:
"range" => [
"pub_date" => [
"from" => strtotime($parseParams['pub_date_start']),
"to" => strtotime($parseParams['pub_date_end']),
]
]
Рад, что помогло :)
большое спасибо, сэр @NishantSaini, это работает как шарм!