Elasti c Search query_shard_exception не удалось выполнить запрос в поле даты и времени - PullRequest
0 голосов
/ 16 января 2020

недавно я использую Kibana для получения данных из ElasticSearch.

Есть этот узел:

  { "_index" : "impasti",
    "_type" : "impasti",
    "_id" : "2019-01-02T15:25:20",
    "_score" : 1.9806902,
    "_source" : {
      "sensor" : "Temperature",
      "mac_address" : "",
      "time" : "2019-01-02T14:25:19.728709Z",
      "unit" : "'C",
      "value" : 20.937
    }},

Я пытаюсь получить данные по полю time в диапазон даты или времени. Но когда я запускаю этот запрос

POST /impasti/impasti/_search {'query':{ "query_string": { "default_field": "time", "query": "2019-01-02T14:25:19.728709Z" } } }

ответом является ошибка, подобная этой:

"type": "query_shard_exception" "reason": "Failed to parse query [2019-01-02T14:25:19.728709Z]",

Где ошибка?

Спасибо парни

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Не могли бы вы обновить этот запрос, который дает вам эту ошибку в вопросе. Я могу быстро проверить и сообщить вам.

Конечно! Это запрос

`POST /impasti/impasti/_search{
      "query":{
           "filtered": {
               "query": {
                   "query_string": {
                       "default_field": "time",
                       "query": "time:[2019-01-02T14:20:19.728709Z TO 2019-02-02T14:25:19.728709Z]"
                    }
               }, 

               "filter": {
                   "term":{ "sensor": "temperature" }
                }
         }
     }
}` 

Получается эта ошибка:

no [query] registered for [filtered]
0 голосов
/ 16 января 2020

Ошибка означает, что вам нужно будет сделать что-то большее, чтобы синтаксический анализатор запросов ES понял, что это значение date, а не string/text/keyword тип:

Кроме того, обычно используются поля даты для определенного диапазона. Ниже описано, как это можно сделать, добавив Range feature

Используя query_string:

POST your_index_name/_search
{
  "query": {
    "query_string": {
      "default_field": "time",
      "query": "time:[2019-01-02T14:25:19.728709Z TO 2019-01-02T14:25:19.728709Z]"
    }
  }
}

Обычно это [min To max] для поиска документов в указанном временном диапазоне, но если вы хотите найти документы на эту дату, укажите одну и ту же дату для min и max.

Использование Range Bool Query:

POST you_index_name/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "mydate": {
              "gte": "2019-01-02T14:25:19.728709Z",
              "lte": "2019-01-02T14:25:19.728709Z"
            }
          }
        }
      ]
    }
  }
}

Выше приведен пример Range Query с использованием запроса DSL

В качестве альтернативы вы также можете использовать простой запрос на совпадение, чтобы получить то, что вы хотите, используя DSL-запрос через Term Query , потому что внутренне он хранится как long значение.

POST your_index_name/_search
{
  "query": {
    "term": {
      "mydate": "2019-01-02T14:25:19.728709Z"
    }
  }
}

Примечание: Elasticsearch хранит значения даты в виде long типа данных в своем инвертированном индексе, как указано в этой ссылке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...