Формат настройки Elasticsearch для пользовательской даты - PullRequest
2 голосов
/ 10 июня 2019

Это мой формат даты:

10:00 2019-06-03

Согласно документам Elasticsearch, я могу сделать это:

{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "HH:mm yyyy-MM-dd"
      }
    }
  }
}

Однако, когда я делаю это, он не распознает это как дату (и, следовательно, преобразует ее в метку времени. Кто-нибудь понимает, почему?

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

1 Ответ

2 голосов
/ 10 июня 2019

Допустим, у нас есть приведенное ниже отображение для поля date, которое вы задали в своем вопросе

PUT <your_index_name>
{  
   "mappings":{  
      "properties":{  
         "date":{  
            "type":"date",
            "format":"HH:mm yyyy-MM-dd||yyyy-MM-dd HH:mm"
         }
      }
   }
}

Обратите внимание, как я добавил два разных типа форматов даты

Позвольте мне добавить два документа:

POST mydate/_doc/1
{
  "date": "10:00 2019-06-03"
}

POST mydate/_doc/2
{
  "date": "2019-06-03 10:00"
}

Обратите внимание на приведенные выше два значения даты. Semantically они оба означают одно и то же. Это должно быть сохранено во время запроса.

Теперь, если пользователь хочет выполнить поиск на основе на основе семантического значения того, каким должно быть значение даты, он / она должен получить оба документа.

POST <your_index_name>/_search
{
  "query": {
    "match": {
      "date": "10:00 2019-06-03"
    }
  }
}

Ответ:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "mydate",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "date" : "10:00 2019-06-03"
        }
      },
      {
        "_index" : "mydate",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "date" : "2019-06-03 10:00"
        }
      }
    ]
  }
}

Что и наблюдается в ответе. Оба эти документа возвращаются.

Это было бы возможно только в том случае, если базовый механизм хранения значений точно такой же. Внутри инвертированного индекса оба эти значения будут сохранены как одно и то же число long.

Теперь, если вы удалите это семантическое определение, то оба эти значения ничем не отличаются от простых строк, где, как вы знаете, 10:00 2019-06-03 и 2019-06-03 10:00 оба отличаются и придерживаются семантики того, что строка должна быть (И если date работает так, зачем вообще иметь тип данных date, правильно).

То, что мы указываем как format в отображении, это то, как значение даты должно отображаться для пользователя.

Обратите внимание на информацию ниже по этой ссылке :

Внутренне даты конвертируются в UTC (если указан часовой пояс) и сохраняется как длинное число, представляющее миллисекунды с начала эпохи.

Запросы по датам внутренне преобразуются в запросы диапазона по этому длинное представление, а также результат агрегации и хранимых полей преобразуется обратно в строку в зависимости от формата даты связан с полем.

Надеюсь, это поможет!

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