API индекса
Добавляет JSON-документ в указанный поток данных или индекс и делает его доступным для поиска. Если целевой объект является индексом, и документ уже существует, запрос обновляет документ и увеличивает его версию.
Вы не можете использовать API индекса для отправки запросов на обновление существующих документов в поток данных. См. Обновление документов в потоке данных по запросу и Обновление или удаление документов в базовом индексе.
Запрос
PUT /<target>/_doc/<_id>
POST /<target>/_doc/
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
Вы не можете добавлять новые документы в поток данных, используя формат запроса PUT /<target>/_doc/<_id>. Чтобы указать идентификатор документа, используйте формат PUT /<target>/_create/<_id>. См. Добавление документов в поток данных.
Предварительные условия
-
Если функции безопасности Elasticsearch включены, у вас должны быть следующие права доступа к индексам для целевого потока данных, индекса или псевдонима индекса:
- Для добавления или перезаписи документа с помощью формата запроса
PUT /<target>/_doc/<_id>, у вас должны быть права доступа к индексуcreate,indexилиwrite. - Для добавления документа с помощью форматов запросов
POST /<target>/_doc/,PUT /<target>/_create/<_id>илиPOST /<target>/_create/<_id>, у вас должны быть права доступа к индексуcreate_doc,create,indexилиwrite. - Для автоматического создания потока данных или индекса с помощью запроса API индекса, у вас должны быть права доступа к индексу
auto_configure,create_indexилиmanage.
- Для добавления или перезаписи документа с помощью формата запроса
- Автоматическое создание потока данных требует соответствующей шаблон индекса с включённым потоком данных. См. Настройка потока данных.
Параметры пути
-
<target> -
(Обязательный, строка) Имя потока данных или индекса, на который направляется запрос.
Если целевой объект не существует и соответствует имени или шаблону подстановочного знака (
*) шаблону шаблона индекса сdata_streamопределением, этот запрос создаёт поток данных. См. Настройка потока данных.Если целевой объект не существует и не соответствует шаблону потока данных, этот запрос создаёт индекс.
Вы можете проверить наличие целевых объектов, используя API разрешения индекса.
-
<_id> -
(Необязательный, строка) Уникальный идентификатор документа.
Этот параметр обязателен для следующих форматов запросов:
-
PUT /<target>/_doc/<_id> -
PUT /<target>/_create/<_id> -
POST /<target>/_create/<_id>
Для автоматической генерации идентификатора документа используйте формат запроса
POST /<target>/_doc/и опустите этот параметр. -
Параметры запроса
-
if_seq_no - (Необязательный, целое число) Выполнить операцию только в том случае, если у документа есть этот номер последовательности. См. Оптимистический контроль конкуретности.
-
if_primary_term - (Необязательный, целое число) Выполнить операцию только в том случае, если у документа есть этот первичный термин. См. Оптимистический контроль конкуретности.
-
op_type -
(Необязательный, перечисление) Установите значение
create, чтобы индексировать документ только в том случае, если он еще не существует (вставить, если отсутствует). Если документ со специфицированным_idуже существует, операция индексирования завершится ошибкой. Аналогично использованию конечной точки<index>/_create. Допустимые значения:index,create. Если идентификатор документа указан, он по умолчаниюindex. В противном случае по умолчаниюcreate.Если запрос направлен на поток данных, требуется
op_typeформатаcreate. См. Добавление документов в поток данных. -
pipeline - (Необязательный, строка) Идентификатор конвейера для предварительной обработки входящих документов.
-
refresh - (Необязательный, перечисление) Если
true, Elasticsearch обновляет затронутые фрагменты, чтобы сделать эту операцию видимой для поиска; еслиwait_for, ожидает обновления для видимости; еслиfalse, не выполняет никаких действий с обновлениями. Допустимые значения:true,false,wait_for. По умолчанию:false. -
routing - (Необязательный, строка) Пользовательское значение, используемое для маршрутизации операций к определённому фрагменту.
-
timeout -
(Необязательный, единицы времени) Период ожидания запросом следующих операций:
По умолчанию
1m(одна минута). Это гарантирует, что Elasticsearch дождётся, по крайней мере, таймаута, прежде чем завершить операцию с ошибкой. Фактическое время ожидания может быть больше, особенно при нескольких операциях ожидания. -
version - (Необязательный, целое число) Явное значение версии для контроля конкуретности. Указанная версия должна совпадать с текущей версией документа для успешного выполнения запроса.
-
version_type - (Необязательный, перечисление) Специфический тип версии:
external,external_gte. -
wait_for_active_shards -
(Необязательный, строка) Количество активных копий фрагментов, необходимых для продолжения операции. Установите значение
allили любое положительное целое число до максимального количества фрагментов в индексе (number_of_replicas+1). По умолчанию: 1, первичный фрагмент.См. Активные фрагменты.
-
require_alias - (Необязательный, логическое значение) Если
true, назначение должно быть псевдонимом индекса. По умолчаниюfalse.
Тело запроса
-
<field> - (Обязательный, строка) Тело запроса содержит JSON-источник данных документа.
Ответ тела
-
_shards - Предоставляет информацию о процессе репликации операции индексации.
-
_shards.total - Указывает, на скольких копиях фрагментов (первичных и реплицируемых фрагментов) должна быть выполнена операция индексации.
-
_shards.successful -
Указывает количество копий фрагментов, на которых операция индексации прошла успешно. При успешной операции индексации значение
successfulдолжно быть не меньше 1.Реплицируемые фрагменты могут быть не запущены к моменту успешного возврата операции индексации — по умолчанию требуется только первичный фрагмент. Чтобы изменить это поведение по умолчанию, установите значение
wait_for_active_shards. Смотрите Активные фрагменты. -
_shards.failed - Массив, содержащий ошибки, связанные с репликацией, в случае, если операция индексации не выполнилась на реплицируемом фрагменте. Значение 0 указывает на отсутствие ошибок.
-
_index - Имя индекса, в который был добавлен документ.
-
_type - Тип документа. Индексы Elasticsearch теперь поддерживают единый тип документа,
_doc. -
_id - Уникальный идентификатор добавленного документа.
-
_version - Версия документа. Увеличивается каждый раз при обновлении документа.
-
_seq_no - Номер последовательности, назначенный документу для операции индексации. Номера последовательности используются для предотвращения перезаписи более новой версии документа более старой версией. Смотрите Оптимистический контроль конкуретности.
-
_primary_term - Первичный термин, назначенный документу для операции индексации. Смотрите Оптимистический контроль конкуретности.
-
result - Результат операции индексации,
createdилиupdated.
Описание
Вы можете добавить новый JSON-документ с помощью ресурса _doc или _create. Использование _create гарантирует, что документ будет проиндексирован только в том случае, если он еще не существует. Для обновления существующего документа необходимо использовать ресурс _doc.
Автоматическое создание потоков данных и индексов
Если целевой объект запроса не существует и соответствует шаблону индекса с определением data_stream, операция индексации автоматически создаст поток данных. См. создание шаблона индекса.
Если целевой объект не существует и не соответствует шаблону потока данных, операция автоматически создает индекс и применяет все соответствующие шаблоны индексов.
Elasticsearch включает несколько встроенных шаблонов индексов. Чтобы избежать конфликтов имен с этими шаблонами, см. избегайте конфликтов шаблонов индексов.
Если отображение отсутствует, операция индексации создаёт динамическое отображение. По умолчанию новые поля и объекты автоматически добавляются в отображение при необходимости. Дополнительную информацию об отображении полей см. в разделе отображение и в API обновления отображения.
Автоматическое создание индекса контролируется настройкой action.auto_create_index. По умолчанию используется значение true, что позволяет автоматически создавать любой индекс. Вы можете изменить эту настройку, чтобы явно разрешить или заблокировать автоматическое создание индексов, соответствующих указанным шаблонам, или установить её в значение false, чтобы полностью отключить автоматическое создание индексов. Укажите список шаблонов через запятую, которые вы хотите разрешить, или добавьте префикс + или - к каждому шаблону, чтобы указать, следует ли его разрешить или заблокировать. При указании списка по умолчанию поведение настроек — блокировка.
Настройка action.auto_create_index влияет только на автоматическое создание индексов. Она не влияет на создание потоков данных.
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "my-index-000001,index10,-index1*,+ind*"
}
}
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false"
}
}
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true"
}
} | Разрешить автоматическое создание индексов с именами | |
| Полностью отключить автоматическое создание индексов. | |
| Разрешить автоматическое создание любых индексов. Это значение по умолчанию. |
Создать, если отсутствует
Вы можете принудительно выполнить операцию создания, используя ресурс _create или установив параметр op_type в значение create. В этом случае операция индексации завершается ошибкой, если документ с указанным идентификатором уже существует в индексе.
Автоматически создавать идентификаторы документов
При использовании формата запроса POST /<target>/_doc/ параметр op_type автоматически устанавливается в значение create, и операция индексации генерирует уникальный идентификатор для документа.
POST my-index-000001/_doc/
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
} API возвращает следующий результат:
{
"_shards": {
"total": 2,
"failed": 0,
"successful": 2
},
"_index": "my-index-000001",
"_type": "_doc",
"_id": "W0tpsmIBdwcYyG50zbta",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"result": "created"
} Оптимистический контроль одновременного доступа
Операции индексации могут выполняться условно и только если последнее изменение документа было присвоено порядковый номер и первичный термин, указанные параметрами if_seq_no и if_primary_term. Если обнаружено несоответствие, операция приведет к VersionConflictException и коду состояния 409. Дополнительные сведения см. в разделе Оптимистический контроль одновременного доступа.
Маршрутизация
По умолчанию размещение фрагментов — или routing — управляется с помощью хэширования значения идентификатора документа. Для более точного контроля значение, подаваемое в функцию хэширования, используемую маршрутизатором, можно указать непосредственно для каждой операции с помощью параметра routing. Например:
POST my-index-000001/_doc?routing=kimchy
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
} В этом примере документ маршрутизируется в фрагмент на основе параметра routing, предоставленного: "kimchy".
При настройке явного отображения вы также можете использовать поле _routing для направления операции индексации на извлечение значения маршрутизации из самого документа. Это влечёт (очень незначительные) затраты на дополнительный проход по анализу документа. Если отображение _routing определено и установлено в значение required, операция индексации завершится ошибкой, если не предоставлено или не извлечено значение маршрутизации.
Потоки данных не поддерживают пользовательскую маршрутизацию. Вместо этого обратитесь к соответствующему базовому индексу для потока.
Распределённая обработка
Операция индексации направляется на первичный фрагмент на основе маршрута (см. раздел Маршрутизация выше) и выполняется на фактическом узле, содержащем этот фрагмент. После завершения операции первичным фрагментом, при необходимости, обновление распространяется на соответствующие реплики.
Активные фрагменты
Для повышения устойчивости операций записи в систему операции индексирования могут быть сконфигурированы для ожидания определённого количества активных копий фрагментов перед продолжением операции. Если необходимое количество активных копий фрагментов недоступно, операция записи должна ожидать и повторять попытку, пока либо необходимые копии фрагментов не начнут работу, либо не произойдёт истечение времени ожидания. По умолчанию операции записи ожидают только активации первичных фрагментов перед продолжением (то есть wait_for_active_shards=1). Это значение по умолчанию может быть динамически переопределено в настройках индекса, установив index.write.wait_for_active_shards. Чтобы изменить это поведение для каждой операции, можно использовать параметр запроса wait_for_active_shards.
Допустимые значения — all или любое положительное целое число до максимального количества настроенных копий на фрагмент в индексе (которое равно number_of_replicas+1). Указание отрицательного значения или числа, превышающего количество копий фрагментов, вызовет ошибку.
Например, предположим, что у нас есть кластер из трёх узлов, A, B и C, и мы создаём индекс index с количеством реплик, установленным в 3 (что приводит к 4 копиям фрагментов, на одну копию больше, чем узлов). Если мы пытаемся выполнить операцию индексирования, то по умолчанию операция будет гарантировать, что доступна первичная копия каждого фрагмента, прежде чем продолжить. Это означает, что даже если B и C вышли из строя, а A разместил первичные копии фрагментов, операция индексирования всё равно продолжится с одной копией данных. Если wait_for_active_shards установлено в запросе на 3 (и все 3 узла работают), то операция индексирования потребует 3 активных копий фрагментов перед продолжением, что должно быть выполнено, так как в кластере 3 активных узла, каждый из которых содержит копию фрагмента. Однако, если мы установим wait_for_active_shards на all (или на 4, что равнозначно), операция индексирования не будет продолжена, так как у нас нет всех 4 копий каждого фрагмента, активных в индексе. Операция истечёт, если не будет поднят новый узел в кластере для размещения четвёртой копии фрагмента.
Важно отметить, что эта настройка значительно снижает вероятность того, что операция записи не будет записана в необходимое количество копий фрагментов, но не исключает её полностью, поскольку эта проверка происходит до начала операции записи. После того, как операция записи началась, всё ещё возможно, что репликация завершится неудачей на любом количестве копий фрагментов, но операция всё же может завершиться успехом на первичном. Раздел _shards ответа операции записи показывает количество копий фрагментов, на которых репликация прошла успешно/неудачно.
{
"_shards": {
"total": 2,
"failed": 0,
"successful": 2
}
} Обновление
Управление временем, когда изменения, внесённые данным запросом, будут видны в результатах поиска. См. обновление.
Операции без изменений
При обновлении документа с помощью API индексации всегда создаётся новая версия документа, даже если документ не изменился. Если это неприемлемо, используйте API _update с параметром detect_noop, установленным в значение true. Этот параметр недоступен в API индексации, так как API индексации не извлекает старое исходное значение и не может сравнить его с новым исходным значением.
Нет жёстких правил, когда операции без изменений неприемлемы. Это сочетание множества факторов, таких как частота, с которой ваш источник данных отправляет обновления, которые на самом деле являются операциями без изменений, и количество запросов в секунду, выполняемых Elasticsearch на фрагменте, получающем обновления.
Время ожидания
Первичный фрагмент, назначенный для выполнения операции индексации, может быть недоступен при выполнении операции индексирования. Причинами этого могут быть текущая реконфигурация первичного фрагмента из-за восстановления с портала или перераспределения. По умолчанию операция индексирования будет ждать, пока первичный фрагмент станет доступным в течение 1 минуты перед завершением с ошибкой и возвращением ошибки. Параметр timeout может использоваться для явного указания времени ожидания. Вот пример установки его на 5 минут:
PUT my-index-000001/_doc/1?timeout=5m
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
} Версии
Каждый индексируемый документ получает номер версии. По умолчанию используется внутренняя система версионирования, которая начинается с 1 и увеличивается при каждом обновлении, включая удаления. Дополнительно, номер версии может быть установлен во внешнее значение (например, если он хранится в базе данных). Для активации этой функции version_type следует установить в значение external. Указанное значение должно быть числовым значением типа long, большим или равным 0 и меньшим примерно 9.2e+18.
При использовании внешнего типа версии система проверяет, больше ли номер версии, переданный в запрос индексирования, чем версия текущего хранимого документа. Если это так, документ будет индексирован, и будет использоваться новый номер версии. Если предоставленное значение меньше или равно номеру версии хранимого документа, произойдёт конфликт версий, и операция индексации завершится неудачей. Например:
PUT my-index-000001/_doc/1?version=2&version_type=external
{
"user": {
"id": "elkbee"
}
} Версионирование выполняется в реальном времени и не зависит от аспектов поиска в режиме около реального времени. Если версия не указана, операция выполняется без проверок версии.
В предыдущем примере операция будет выполнена успешно, так как указанная версия 2 выше текущей версии документа 1. Если документ уже был обновлен и его версия установлена на 2 или выше, команда индексирования завершится с ошибкой и конфликтом (код состояния HTTP 409).
Приятным побочным эффектом является то, что нет необходимости поддерживать строгую последовательность операций асинхронного индексирования, выполняемых в результате изменений в исходной базе данных, если используются номера версий из исходной базы данных. Даже в простом случае обновления индекса Elasticsearch данными из базы данных упрощается, если используется внешнее версионирование, так как будет использоваться только последняя версия, если операции индексирования по какой-либо причине придут в неправильном порядке.
Типы версий
В дополнение к типу версии external Elasticsearch также поддерживает другие типы для определенных случаев использования:
-
externalилиexternal_gt - Индексировать документ только если заданная версия строго выше версии хранящегося документа или если документа не существует. Заданная версия будет использоваться в качестве новой версии и будет сохранена с новым документом. Заданная версия должна быть неотрицательным целым числом.
-
external_gte - Индексировать документ только если заданная версия равна или выше версии хранящегося документа. Если существующего документа нет, операция также будет выполнена успешно. Заданная версия будет использоваться в качестве новой версии и будет сохранена с новым документом. Заданная версия должна быть неотрицательным целым числом.
Тип версии external_gte предназначен для специальных случаев использования и должен использоваться с осторожностью. При неправильном использовании это может привести к потере данных. Существует еще один вариант, force, который устарел, потому что он может привести к расхождению первичных и реплицируемых фрагментов.
Примеры
Вставить JSON-документ в индекс my-index-000001 с версией _id 1:
PUT my-index-000001/_doc/1
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
} API возвращает следующий результат:
{
"_shards": {
"total": 2,
"failed": 0,
"successful": 2
},
"_index": "my-index-000001",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"result": "created"
} Используйте ресурс _create для индексирования документа в индекс my-index-000001, если документ с таким идентификатором не существует:
PUT my-index-000001/_create/1
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
} Установите параметр op_type в create для индексирования документа в индекс my-index-000001, если документ с таким идентификатором не существует:
PUT my-index-000001/_doc/1?op_type=create
{
"@timestamp": "2099-11-15T13:12:00",
"message": "GET /search HTTP/1.1 200 1070000",
"user": {
"id": "kimchy"
}
}
© 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/docs-index_.html