Допустим, у нас есть приведенное ниже отображение для поля 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 (если указан часовой пояс)
и сохраняется как длинное число, представляющее миллисекунды с начала эпохи.
Запросы по датам внутренне преобразуются в запросы диапазона по этому
длинное представление, а также результат агрегации и хранимых полей
преобразуется обратно в строку в зависимости от формата даты
связан с полем.
Надеюсь, это поможет!