(Elasticsearch) Преобразование данных в формате Unix в метку времени (без изменения сопоставлений)

Мы выполняем такой запрос 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, теперь он отображает такую ​​ошибку:

(Elasticsearch) Преобразование данных в формате Unix в метку времени (без изменения сопоставлений)Пробные решения
Я попытался добавить дополнительный формат 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 будет более удобным подходом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку поле имеет тип 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, это работает как шарм!

Suomynona 21.06.2019 06:30

Рад, что помогло :)

Nishant 21.06.2019 06:32

Другие вопросы по теме