Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Mapping ›Типы данных полей

Массивы

В Elasticsearch нет специального array типа данных. По умолчанию любое поле может содержать ноль или более значений, однако все значения в массиве должны быть одного типа данных. Например:

  • массив строк: [ "one", "two" ]
  • массив целых чисел: [ 1, 2 ]
  • массив массивов: [ 1, [ 2, 3 ]] что эквивалентно [ 1, 2, 3 ]
  • массив объектов: [ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]

Массивы объектов

Массивы объектов работают не так, как ожидается: нельзя запросить каждый объект независимо от других объектов в массиве. Если вам нужно сделать это, то вместо типа данных object следует использовать тип данных nested.

Более подробное объяснение содержится в разделе Вложенные поля.

При динамическом добавлении поля первое значение в массиве определяет type поля. Все последующие значения должны быть того же типа данных или должно быть возможно привести последующие значения к одному типу данных.

Массивы с различными типами данных не поддерживаются: [ 10, "some string" ]

Массив может содержать null значения, которые либо заменяются наконфигурированное null_value, либо пропускаются. Пустой массив [] рассматривается как отсутствующее поле — поле без значений.

Для использования массивов в документах ничего предварительно настраивать не нужно, они поддерживаются по умолчанию:

PUT my-index-000001/_doc/1
{
  "message": "some arrays in this document...",
  "tags":  [ "elasticsearch", "wow" ], 
  "lists": [ 
    {
      "name": "prog_list",
      "description": "programming list"
    },
    {
      "name": "cool_list",
      "description": "cool stuff list"
    }
  ]
}

PUT my-index-000001/_doc/2 
{
  "message": "no arrays in this document...",
  "tags":  "elasticsearch",
  "lists": {
    "name": "prog_list",
    "description": "programming list"
  }
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "tags": "elasticsearch" 
    }
  }
}

Поле tags динамически добавляется как поле типа string.

Поле lists динамически добавляется как поле типа object.

Второй документ не содержит массивов, но может быть индексирован в те же поля.

Запрос ищет elasticsearch в поле tags и находит оба документа.

Поля с несколькими значениями и инвертированный индекс

Тот факт, что все типы полей по умолчанию поддерживают поля с несколькими значениями, является следствием происхождения Lucene. Lucene был разработан как полнотекстовый поисковый движок. Чтобы можно было искать отдельные слова в большом блоке текста, Lucene разбивает текст на отдельные термины и добавляет каждый термин в инвертированный индекс отдельно.

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

© 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/7.17/array.html

Spec-Zone.ru

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