Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Отображение ›Типы данных полей

Тип поля Дата

В JSON нет типа данных дата, поэтому даты в Elasticsearch могут быть представлены:

  • строками с отформатированными датами, например "2015-01-01" или "2015/01/01 12:10:30".
  • числом, представляющим количество миллисекунд с начала эпохи.
  • числом, представляющим количество секунд с начала эпохи (настройки).

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

Используйте тип поля date_nanos, если требуется разрешение до наносекунд.

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

Даты всегда будут отображаться как строки, даже если они были изначально заданы как целые числа в JSON-документе.

Форматы дат можно настроить, но если format не указан, используется значение по умолчанию:

    "strict_date_optional_time||epoch_millis"

Это означает, что он будет принимать даты с необязательными метками времени, соответствующие форматам, поддерживаемым strict_date_optional_time или миллисекундам с начала эпохи.

Например:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "date": {
                "type": "date"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "date": "2015-01-01"
    },
)
print(resp1)

resp2 = client.index(
    index="my-index-000001",
    id="2",
    document={
        "date": "2015-01-01T12:10:30Z"
    },
)
print(resp2)

resp3 = client.index(
    index="my-index-000001",
    id="3",
    document={
        "date": 1420070400001
    },
)
print(resp3)

resp4 = client.search(
    index="my-index-000001",
    sort={
        "date": "asc"
    },
)
print(resp4)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        date: {
          type: 'date'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    date: '2015-01-01'
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 2,
  body: {
    date: '2015-01-01T12:10:30Z'
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 3,
  body: {
    date: 1_420_070_400_001
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    sort: {
      date: 'asc'
    }
  }
)
puts response
{
	res, err := es.Indices.Create(
		"my-index-000001",
		es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "date": {
	        "type": "date"
	      }
	    }
	  }
	}`)),
	)
	fmt.Println(res, err)
}

{
	res, err := es.Index(
		"my-index-000001",
		strings.NewReader(`{
	  "date": "2015-01-01"
	} `),
		es.Index.WithDocumentID("1"),
		es.Index.WithPretty(),
	)
	fmt.Println(res, err)
}

{
	res, err := es.Index(
		"my-index-000001",
		strings.NewReader(`{
	  "date": "2015-01-01T12:10:30Z"
	} `),
		es.Index.WithDocumentID("2"),
		es.Index.WithPretty(),
	)
	fmt.Println(res, err)
}

{
	res, err := es.Index(
		"my-index-000001",
		strings.NewReader(`{
	  "date": 1420070400001
	} `),
		es.Index.WithDocumentID("3"),
		es.Index.WithPretty(),
	)
	fmt.Println(res, err)
}

{
	res, err := es.Search(
		es.Search.WithIndex("my-index-000001"),
		es.Search.WithBody(strings.NewReader(`{
	  "sort": {
	    "date": "asc"
	  }
	}`)),
		es.Search.WithPretty(),
	)
	fmt.Println(res, err)
}
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      date: {
        type: "date",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    date: "2015-01-01",
  },
});
console.log(response1);

const response2 = await client.index({
  index: "my-index-000001",
  id: 2,
  document: {
    date: "2015-01-01T12:10:30Z",
  },
});
console.log(response2);

const response3 = await client.index({
  index: "my-index-000001",
  id: 3,
  document: {
    date: 1420070400001,
  },
});
console.log(response3);

const response4 = await client.search({
  index: "my-index-000001",
  sort: {
    date: "asc",
  },
});
console.log(response4);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "date": {
        "type": "date" 
      }
    }
  }
}

PUT my-index-000001/_doc/1
{ "date": "2015-01-01" } 

PUT my-index-000001/_doc/2
{ "date": "2015-01-01T12:10:30Z" } 

PUT my-index-000001/_doc/3
{ "date": 1420070400001 } 

GET my-index-000001/_search
{
  "sort": { "date": "asc"} 
}

Поле date использует значение по умолчанию format.

В этом документе указана только дата.

В этом документе указано время.

В этом документе указано количество миллисекунд с начала эпохи.

Обратите внимание, что значения sort, возвращаемые в результате, представлены в формате миллисекунд с начала эпохи.

Даты будут принимать числа с десятичной точкой, как в {"date": 1618249875.123456}, но в некоторых случаях (#70085) точность таких дат будет потеряна, поэтому следует избегать их использования.

Текстовые строки, принимаемые текстовыми форматами дат и вычислениями для дат недели, зависят от версии JDK, на которой работает Elasticsearch. Дополнительную информацию см. в разделе настраиваемые форматы дат.

Несколько форматов дат

Несколько форматов можно указать, разделив их ||. Каждый формат будет проверяться по очереди до тех пор, пока не будет найден соответствующий формат. Первый формат будет использоваться для преобразования значения миллисекунд с начала эпохи в строку.

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "date": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        date: {
          type: 'date',
          format: 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis'
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "date": {
	        "type": "date",
	        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      date: {
        type: "date",
        format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

Параметры для полей date

Следующие параметры принимаются полями date:

doc_values

Необходимо ли хранить поле на диске в виде столбцов, чтобы его можно было использовать для сортировки, агрегаций или скриптов? Принимает true (по умолчанию) или false.

format

Формат(ы) дат, которые можно проанализировать. По умолчанию strict_date_optional_time||epoch_millis.

locale

Язык для анализа дат, поскольку названия и/или аббревиатуры месяцев отличаются в разных языках. По умолчанию АНГЛИЙСКИЙ.

ignore_malformed

Если true, некорректные числа игнорируются. Если false (по умолчанию), некорректные числа приводят к исключению и отклонению всего документа. Обратите внимание, что это не может быть установлено, если используется параметр script.

index

Должно ли поле быть быстро находимым в результатах поиска? Принимает true (по умолчанию) и false. Поля дат, для которых включены только doc_values, также могут быть запрошены, хотя и медленнее.

null_value

Принимает значение даты из одного из настроенных format в качестве поля, которое подставляется вместо явных значений null. По умолчанию null, что означает, что поле считается отсутствующим. Обратите внимание, что это не может быть установлено, если используется параметр script.

on_script_error

Определяет, что делать, если скрипт, определённый параметром script, выдает ошибку во время индексирования. Принимает fail (по умолчанию), что приведет к отклонению всего документа, и continue, что зарегистрирует поле в метаданных документа _ignored и продолжит индексирование. Этот параметр может быть установлен только в том случае, если также установлен параметр script.

script

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

store

Необходимо ли сохранять значение поля отдельно от поля _source. Принимает true или false (по умолчанию).

meta

Метаданные о поле.

Секунды эпохи

Если вам нужно отправлять даты как секунды с начала эпохи, убедитесь, что format содержит epoch_second:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "date": {
                "type": "date",
                "format": "strict_date_optional_time||epoch_second"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="example",
    refresh=True,
    document={
        "date": 1618321898
    },
)
print(resp1)

resp2 = client.search(
    index="my-index-000001",
    fields=[
        {
            "field": "date"
        }
    ],
    source=False,
)
print(resp2)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        date: {
          type: 'date',
          format: 'strict_date_optional_time||epoch_second'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 'example',
  refresh: true,
  body: {
    date: 1_618_321_898
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    fields: [
      {
        field: 'date'
      }
    ],
    _source: false
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      date: {
        type: "date",
        format: "strict_date_optional_time||epoch_second",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: "example",
  refresh: "true",
  document: {
    date: 1618321898,
  },
});
console.log(response1);

const response2 = await client.search({
  index: "my-index-000001",
  fields: [
    {
      field: "date",
    },
  ],
  _source: false,
});
console.log(response2);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "strict_date_optional_time||epoch_second"
      }
    }
  }
}

PUT my-index-000001/_doc/example?refresh
{ "date": 1618321898 }

POST my-index-000001/_search
{
  "fields": [ {"field": "date"}],
  "_source": false
}

Что вернёт дату, подобную:

{
  "hits": {
    "hits": [
      {
        "_id": "example",
        "_index": "my-index-000001",
        "_score": 1.0,
        "fields": {
          "date": ["2021-04-13T13:51:38.000Z"]
        }
      }
    ]
  }
}

Синтетические _source

Синтетические _source доступны для индексов TSDB (индексы, для которых index.mode установлено в time_series). Для других индексов синтетические _source находятся на стадии технического предварительного просмотра. Функции на стадии технического предварительного просмотра могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции на стадии технического предварительного просмотра не подпадают под гарантии поддержки официальных функций GA.

Синтетические исходные данные могут сортировать значения поля date. Например:

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "properties": {
            "date": {
                "type": "date"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "date": [
            "2015-01-01T12:10:30Z",
            "2014-01-01T12:10:30Z"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      date: {
        type: "date",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    date: ["2015-01-01T12:10:30Z", "2014-01-01T12:10:30Z"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "date": { "type": "date" }
    }
  }
}
PUT idx/_doc/1
{
  "date": ["2015-01-01T12:10:30Z", "2014-01-01T12:10:30Z"]
}

Преобразуется в:

{
  "date": ["2014-01-01T12:10:30.000Z", "2015-01-01T12:10:30.000Z"]
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/date.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API