(Elasticsearch) Преобразование данных, отформатированных в Unix, во временную метку (без изменения отображений) - PullRequest
0 голосов
/ 21 июня 2019

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

Error Пробные решения
Я попытался добавить дополнительный формат 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, поэтому запрос не выполняется. Есть ли обходной путь для этого без изменения MAPPINGS индекса?

Поскольку другие возможные решения предлагали изменить отображение, но у нас уже есть около 25 миллионов документов в индексе, поэтому мы подумали, что форматирование в PHP будет более подходящим подходом

1 Ответ

1 голос
/ 21 июня 2019

Поскольку поле имеет тип long и хранит метку времени Unix, просто преобразуйте дату в $parseParams['pub_date_start'] и $parseParams['pub_date_end'] в метку времени Unix, используя strtotime .Обновите запрос диапазона, как показано ниже:

"range" => [
  "pub_date" => [
      "from" => strtotime($parseParams['pub_date_start']),
      "to"   => strtotime($parseParams['pub_date_end']),
    ]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...