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

Семейство типов данных Keyword

Семейство keyword включает следующие типы полей:

  • keyword, который используется для структурированного контента, такого как идентификаторы, адреса электронной почты, имена хостов, коды состояния, почтовые индексы или теги.
  • constant_keyword для полей keyword, которые всегда содержат одно и то же значение.
  • wildcard для неструктурированного контента, сгенерированного машиной. Тип wildcard оптимизирован для полей с большими значениями или высокой кардинальностью.

Поля keyword часто используются в сортировке, агрегациях и запросах на уровне терминов, таких как term.

Избегайте использования полей keyword для полнотекстового поиска. Используйте вместо этого тип поля text.

Тип поля Keyword

Ниже приведен пример отображения для базового поля keyword:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "tags": {
                "type": "keyword"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        tags: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "tags": {
	        "type": "keyword"
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      tags: {
        type: "keyword",
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "tags": {
        "type":  "keyword"
      }
    }
  }
}

Отображение числовых идентификаторов

Не все числовые данные должны отображаться как тип данных поля числовой. Elasticsearch оптимизирует числовые поля, такие как integer или long, для range запросов. Однако поля keyword лучше подходят для term и других запросов на уровне терминов.

Идентификаторы, такие как ISBN или идентификатор продукта, редко используются в range запросах. Однако они часто извлекаются с помощью запросов на уровне терминов.

Рассмотрите отображение числового идентификатора как keyword, если:

  • Вы не планируете искать данные идентификатора с помощью запросов range.
  • Быстрое извлечение имеет значение. term запросы к полям keyword часто быстрее, чем term запросы к числовым полям.

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

Параметры для базовых полей Keyword

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

doc_values
Необходимо ли хранить поле на диске в столбце, чтобы его можно было использовать для сортировки, агрегаций или скриптов? Принимает true (по умолчанию) или false.
eager_global_ordinals
Необходимо ли загружать глобальные порядковые номера по запросу? Принимает true или false (по умолчанию). Включение этого параметра рекомендуется для полей, которые часто используются в агрегациях по терминам.
fields
Мультиполя позволяют одному и тому же строковому значению индексироваться различными способами для различных целей, например, одно поле для поиска и мультиполе для сортировки и агрегаций.
ignore_above
Не индексировать любые строки, длиннее этого значения. По умолчанию значение 2147483647, так что все значения будут приняты. Обратите внимание, однако, что правила динамического отображения по умолчанию создают подполе keyword, которое переопределяет это значение по умолчанию, установив ignore_above: 256.
index
Должно ли поле быстро индексироваться? Принимает true (по умолчанию) и false. keyword поля, которые имеют только включенную возможность doc_values, всё же могут быть запрошены, но медленнее.
index_options
Какая информация должна храниться в индексе для целей оценки. По умолчанию docs, но также может быть установлено значение freqs, чтобы учитывать частоту встречаемости термина при расчете оценок.
meta
Метаданные о поле.
norms
Учитывать ли длину поля при оценке запросов. Принимает true или false (по умолчанию).
null_value
Принимает строковое значение, которое используется в качестве замены для явных null значений. По умолчанию null, что означает, что поле считается отсутствующим. Обратите внимание, что это значение не может быть установлено, если используется значение script.
on_script_error
Определяет, что делать, если скрипт, определенный параметром script, генерирует ошибку при индексировании. Принимает fail (по умолчанию), что приведет к отклонению всего документа, и continue, которое зарегистрирует поле в метаданных документа под полем _ignored и продолжит индексирование. Этот параметр может быть задан только если задан параметр script.
script
Если этот параметр задан, поле будет индексировать значения, генерируемые этим скриптом, а не считывать значения непосредственно из источника. Если для этого поля в документе задано значение, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их аналоги runtime. Выводимые скриптом значения нормализуются как обычно и будут проигнорированы, если они длиннее значения, установленного в параметре ignore_above.
store
Хранить ли значение поля отдельно от поля _source. Принимает true или false (по умолчанию).
similarity
Какой алгоритм оценки или подобия использовать. По умолчанию BM25.
normalizer
Как предварительно обработать keyword перед индексированием. По умолчанию null, что означает, что keyword сохраняется как есть.
split_queries_on_whitespace
Разбивать ли полнотекстовые запросы входные данные на пробелы при построении запроса для этого поля. Принимает true или false (по умолчанию).
time_series_dimension

(Необязательный, Булево)

Отмечает поле как размерность временного ряда. По умолчанию false.

Настройка индекса index.mapping.dimension_fields.limit ограничивает количество измерений в индексе.

Поля измерений имеют следующие ограничения:

  • Параметры отображения doc_values и index должны быть true.
  • Значения измерений используются для определения временного ряда документа. Если значения измерений изменяются каким-либо образом во время индексирования, документ будет храниться как принадлежащий другому временного ряду, чем ожидалось. В результате есть дополнительные ограничения:

    • Поле не может использовать normalizer.

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

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

Синтетический источник может сортировать поля keyword и удалять дубликаты. Например:

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

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "kwd": [
            "foo",
            "foo",
            "bar",
            "baz"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      kwd: {
        type: "keyword",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    kwd: ["foo", "foo", "bar", "baz"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "kwd": { "type": "keyword" }
    }
  }
}
PUT idx/_doc/1
{
  "kwd": ["foo", "foo", "bar", "baz"]
}

Превратится в:

{
  "kwd": ["bar", "baz", "foo"]
}

Если поле keyword устанавливает store в true, то порядок и дубликаты сохраняются. Например:

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

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "kwd": [
            "foo",
            "foo",
            "bar",
            "baz"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      kwd: {
        type: "keyword",
        store: true,
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    kwd: ["foo", "foo", "bar", "baz"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "kwd": { "type": "keyword", "store": true }
    }
  }
}
PUT idx/_doc/1
{
  "kwd": ["foo", "foo", "bar", "baz"]
}

Превратится в:

{
  "kwd": ["foo", "foo", "bar", "baz"]
}

Значения, превышающие ignore_above, сохраняются, но сортируются в конец. Например:

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

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "kwd": [
            "foo",
            "foo",
            "bang",
            "bar",
            "baz"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      kwd: {
        type: "keyword",
        ignore_above: 3,
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    kwd: ["foo", "foo", "bang", "bar", "baz"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "kwd": { "type": "keyword", "ignore_above": 3 }
    }
  }
}
PUT idx/_doc/1
{
  "kwd": ["foo", "foo", "bang", "bar", "baz"]
}

Превратится в:

{
  "kwd": ["bar", "baz", "foo", "bang"]
}

Тип поля constant keyword

Тип constant keyword — это специализация поля keyword в случае, если все документы в индексе имеют одинаковое значение.

resp = client.indices.create(
    index="logs-debug",
    mappings={
        "properties": {
            "@timestamp": {
                "type": "date"
            },
            "message": {
                "type": "text"
            },
            "level": {
                "type": "constant_keyword",
                "value": "debug"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'logs-debug',
  body: {
    mappings: {
      properties: {
        "@timestamp": {
          type: 'date'
        },
        message: {
          type: 'text'
        },
        level: {
          type: 'constant_keyword',
          value: 'debug'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "logs-debug",
  mappings: {
    properties: {
      "@timestamp": {
        type: "date",
      },
      message: {
        type: "text",
      },
      level: {
        type: "constant_keyword",
        value: "debug",
      },
    },
  },
});
console.log(response);
PUT logs-debug
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "message": {
        "type": "text"
      },
      "level": {
        "type": "constant_keyword",
        "value": "debug"
      }
    }
  }
}

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

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

resp = client.index(
    index="logs-debug",
    document={
        "date": "2019-12-12",
        "message": "Starting up Elasticsearch",
        "level": "debug"
    },
)
print(resp)

resp1 = client.index(
    index="logs-debug",
    document={
        "date": "2019-12-12",
        "message": "Starting up Elasticsearch"
    },
)
print(resp1)
response = client.index(
  index: 'logs-debug',
  body: {
    date: '2019-12-12',
    message: 'Starting up Elasticsearch',
    level: 'debug'
  }
)
puts response

response = client.index(
  index: 'logs-debug',
  body: {
    date: '2019-12-12',
    message: 'Starting up Elasticsearch'
  }
)
puts response
const response = await client.index({
  index: "logs-debug",
  document: {
    date: "2019-12-12",
    message: "Starting up Elasticsearch",
    level: "debug",
  },
});
console.log(response);

const response1 = await client.index({
  index: "logs-debug",
  document: {
    date: "2019-12-12",
    message: "Starting up Elasticsearch",
  },
});
console.log(response1);
POST logs-debug/_doc
{
  "date": "2019-12-12",
  "message": "Starting up Elasticsearch",
  "level": "debug"
}

POST logs-debug/_doc
{
  "date": "2019-12-12",
  "message": "Starting up Elasticsearch"
}

Однако предоставление значения, отличного от настроенного в схеме, запрещено.

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

До тех пор, пока значение не будет предоставлено (через схему или из документа), запросы к полю не будут соответствовать ни одному документу. Это включает в себя запросы exists.

value поля изменить после его установки нельзя.

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

Принимаются следующие параметры схемы:

meta

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

value

Значение, которое следует связать со всеми документами в индексе. Если этот параметр не задан, он устанавливается на основе первого индексированного документа.

Тип поля wildcard

Тип поля wildcard — это специализированное поле keyword для неструктурированного машиногенерированного контента, который вы планируете искать с помощью запросов типа grep, таких как wildcard и regexp. Тип wildcard оптимизирован для полей с большими значениями или высокой кардинальностью.

Структурирование неструктурированного контента

Вы можете сопоставить поле, содержащее неструктурированный контент, либо с полем text, либо с полем семейства keyword. Лучший тип поля зависит от характера контента и того, как вы планируете искать в поле.

Используйте тип поля text, если:

  • Контент предназначен для чтения человеком, например, тело письма или описание продукта.
  • Вы планируете искать в поле отдельные слова или фразы, например, the brown fox jumped, используя полнотекстовые запросы. Elasticsearch анализирует поля text, чтобы возвращать наиболее релевантные результаты для этих запросов.

Используйте поле семейства keyword, если:

  • Контент генерируется машиной, например, сообщение журнала или информация HTTP-запроса.
  • Вы планируете искать в поле точные полные значения, например, org.foo.bar, или частичные последовательности символов, такие как org.foo.*, используя запросы на уровне терминов.

Выбор типа поля keyword family

Если вы выбрали тип поля keyword family, вы можете сопоставить поле как keyword или wildcard поле в зависимости от кардинальности и размера значений поля. Используйте тип wildcard, если вы планируете регулярно искать в поле с помощью запроса wildcard или regexp и выполняете одно из следующих условий:

  • Поле содержит более миллиона уникальных значений.
    И
    Вы планируете регулярно искать в поле по шаблону с ведущими подстановочными знаками, например, *foo или *baz.
  • Поле содержит значения, превышающие 32 КБ.
    И
    Вы планируете регулярно искать в поле по любому шаблону подстановки.

В противном случае, используйте тип поля keyword для более быстрых поисков, более быстрой индексации и меньших затрат на хранение. Более подробное сравнение и блок-схема принятия решений см. в нашей статье в блоге.

Переключение с поля text на поле keyword

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

Внутренне поле wildcard индексирует всё значение поля с помощью n-грамм и хранит полную строку. Индекс используется как грубый фильтр для сокращения количества значений, которые затем проверяются путём извлечения и проверки полных значений. Это поле особенно подходит для выполнения запросов типа grep над строками журналов. Стоимость хранения обычно ниже, чем у полей keyword, но скорость поиска точных совпадений по полным терминам медленнее. Если значения полей имеют много общих префиксов, например, URL-адреса одного и того же веб-сайта, стоимость хранения поля wildcard может быть выше, чем у эквивалентного поля keyword.

Вы индексируете и ищете в поле wildcard следующим образом

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

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "my_wildcard": "This string can be quite lengthy"
    },
)
print(resp1)

resp2 = client.search(
    index="my-index-000001",
    query={
        "wildcard": {
            "my_wildcard": {
                "value": "*quite*lengthy"
            }
        }
    },
)
print(resp2)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        my_wildcard: {
          type: 'wildcard'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    my_wildcard: 'This string can be quite lengthy'
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      wildcard: {
        my_wildcard: {
          value: '*quite*lengthy'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      my_wildcard: {
        type: "wildcard",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    my_wildcard: "This string can be quite lengthy",
  },
});
console.log(response1);

const response2 = await client.search({
  index: "my-index-000001",
  query: {
    wildcard: {
      my_wildcard: {
        value: "*quite*lengthy",
      },
    },
  },
});
console.log(response2);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_wildcard": {
        "type": "wildcard"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "my_wildcard" : "This string can be quite lengthy"
}

GET my-index-000001/_search
{
  "query": {
    "wildcard": {
      "my_wildcard": {
        "value": "*quite*lengthy"
      }
    }
  }
}

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

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

null_value

Принимает строковое значение, которое используется как замена явных значений null. По умолчанию устанавливается null, что означает, что поле считается отсутствующим.

ignore_above

Не индексировать строки, длина которых превышает это значение. По умолчанию устанавливается 2147483647, поэтому все значения будут приняты.

Ограничения

  • Поля wildcard не токенизируются, как поля keyword, поэтому не поддерживают запросы, которые зависят от позиций слов, такие как запросы с фразами.
  • При выполнении запросов wildcard любой параметр rewrite игнорируется. Оценка всегда является константной.

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

Синтетический источник может сортировать значения поля wildcard. Например:

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

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "card": [
            "king",
            "ace",
            "ace",
            "jack"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      card: {
        type: "wildcard",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    card: ["king", "ace", "ace", "jack"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "card": { "type": "wildcard" }
    }
  }
}
PUT idx/_doc/1
{
  "card": ["king", "ace", "ace", "jack"]
}

Превратится в:

{
  "card": ["ace", "jack", "king"]
}

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

Spec-Zone.ru

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