Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›REST API ›API документов

API массовой обработки

Выполняет несколько операций индексирования или удаления в одном вызове API. Это уменьшает накладные расходы и может значительно ускорить процесс индексирования.

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

Запрос

POST /_bulk

POST /<target>/_bulk

Предварительные условия

  • Если включены функции безопасности Elasticsearch, необходимо иметь следующие права доступа к индексам для целевого потока данных, индекса или псевдонима индекса:

    • Для использования действия create необходимо иметь право create_doc, create, index или write на индекс. Потоки данных поддерживают только действие create.
    • Для использования действия index необходимо иметь право create, index или write на индекс.
    • Для использования действия delete необходимо иметь право delete или write на индекс.
    • Для использования действия update необходимо иметь право index или write на индекс.
    • Для автоматического создания потока данных или индекса с помощью запроса массовой обработки необходимо иметь право auto_configure, create_index или manage на индекс.
    • Для отображения результата операции массовой обработки в результатах поиска с помощью параметра refresh необходимо иметь право maintenance или manage на индекс.
  • Автоматическое создание потока данных требует соответствующей шаблона индекса с включенной поддержкой потоков данных. См. Настройка потока данных.

Описание

Предоставляет способ выполнения нескольких действий index, create, delete и update в одном запросе.

Действия задаются в теле запроса с использованием структуры JSON с разделителями строк (NDJSON):

action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n

Действия index и create ожидают исходный документ в следующей строке и имеют ту же семантику, что и параметр op_type в стандартном API индексирования: create завершается ошибкой, если документ с таким же идентификатором уже существует в целевом индексе; index добавляет или заменяет документ по необходимости.

Потоки данных поддерживают только действие create. Для обновления или удаления документа в потоке данных необходимо обратиться к подлежащему индексу, содержащему документ. См. Обновление или удаление документов в базовом индексе.

update ожидает, что частичный документ, upsert, скрипт и его параметры будут указаны в следующей строке.

delete не ожидает исходного документа в следующей строке и имеет ту же семантику, что и стандартный API удаления.

Последняя строка данных должна заканчиваться символом новой строки \n. Каждый символ новой строки может предваряться символом возврата каретки \r. При отправке данных NDJSON на конечную точку _bulk используйте заголовок Content-Type со значением application/json или application/x-ndjson.

Поскольку этот формат использует литеральные символы \n в качестве разделителей, убедитесь, что JSON-действия и исходные данные не отформатированы с помощью отступов.

Если вы предоставляете <target> в пути запроса, он используется для любых действий, которые явно не указывают аргумент _index.

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

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

Нет «правильного» количества действий, которые следует выполнять в одном запросе массовой обработки. Экспериментируйте с различными настройками, чтобы найти оптимальный размер для вашей конкретной рабочей нагрузки. Обратите внимание, что Elasticsearch по умолчанию ограничивает максимальный размер HTTP-запроса значением 100mb, поэтому клиенты должны гарантировать, что ни один запрос не превышает этот размер. Индексирование одного документа, размер которого превышает предел, невозможно, поэтому необходимо предварительно обработать такие документы, разделив их на меньшие части, прежде чем отправлять их в Elasticsearch. Например, разделите документы на страницы или главы перед индексированием или храните исходные бинарные данные в системе вне Elasticsearch, заменяя исходные данные ссылкой на внешнюю систему в документах, которые вы отправляете в Elasticsearch.

Поддержка запросов массовой обработки клиентами

Некоторые из официально поддерживаемых клиентов предоставляют вспомогательные средства для работы с запросами массовой обработки и повторной индексацией:

Go
См. esutil.BulkIndexer
Perl
См. Search::Elasticsearch::Client::5_0::Bulk и Search::Elasticsearch::Client::5_0::Scroll
Python
См. elasticsearch.helpers.*
JavaScript
См. client.helpers.*
.NET
См. BulkAllObservable
PHP
См. Массовая индексация
Отправка запросов массовой обработки с помощью cURL

Если вы предоставляете текстовый файл в качестве входных данных для curl, вы обязаны использовать флаг --data-binary вместо простого -d. Последний вариант не сохраняет символы новой строки. Пример:

$ cat requests
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
{"took":7, "errors": false, "items":[{"index":{"_index":"test","_type":"_doc","_id":"1","_version":1,"result":"created","forced_refresh":false}}]}
Оптимистический контроль конкурентности

Каждое действие index и delete в вызове API массовой обработки может включать параметры if_seq_no и if_primary_term в соответствующих строках действия и метаданных. Параметры if_seq_no и if_primary_term управляют выполнением операций, в зависимости от последнего изменения существующих документов. См. Оптимистический контроль конкурентности для получения дополнительной информации.

Версионирование

Каждый элемент массовой обработки может включать значение версии с помощью поля version. Оно автоматически следует поведению операции индексирования/удаления на основе сопоставления _version. Также поддерживается version_type (см. версионирование).

Маршрутизация

Каждый элемент массовой обработки может включать значение маршрутизации с помощью поля routing. Оно автоматически следует поведению операции индексирования/удаления на основе сопоставления _routing.

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

Ожидание активных фрагментов

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

Обновление

Управление моментом, когда изменения, внесенные этим запросом, будут доступны для поиска. См. refresh.

Только фрагменты, получившие запрос массовой обработки, будут затронуты refresh. Представьте запрос _bulk?refresh=wait_for с тремя документами, которые случайно были маршрутизированы в разные фрагменты индекса с пятью фрагментами. Запрос будет ожидать обновления только этих трех фрагментов. Два других фрагмента, составляющие индекс, вообще не участвуют в запросе _bulk.

Безопасность

См. Управление доступом на основе URL.

Параметры пути

<target>
(Необязательно, строка) Имя потока данных, индекса или псевдонима индекса для выполнения операций массовой обработки.

Параметры запроса

pipeline
(Необязательно, строка) Идентификатор конвейера для предобработки входящих документов.
refresh
(Необязательно, перечисление) Если true, Elasticsearch обновляет затронутые фрагменты, чтобы сделать эту операцию видимой для поиска; если wait_for, ожидает обновления, чтобы сделать операцию видимой для поиска; если false, не выполняет никаких действий с обновлениями. Допустимые значения: true, false, wait_for. По умолчанию: false.
require_alias
(Необязательно, логическое значение) Если true, действия запроса должны быть направлены на псевдоним индекса. По умолчанию: false.
routing
(Необязательно, строка) Пользовательское значение, используемое для маршрутизации операций к определённому фрагменту.
_source
(Необязательно, строка) True или false для возвращения поля _source или списка полей для возвращения.
_source_excludes

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

Также можно использовать этот параметр для исключения полей из подмножества, заданного параметром запроса _source_includes.

Если параметр _source равен false, этот параметр игнорируется.

_source_includes

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

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

Если параметр _source равен false, этот параметр игнорируется.

timeout

(Необязательно, единицы времени) Период ожидания каждой операции следующих операций:

  • Автоматическое создание индексов
  • Обновления динамического отображения
  • Ожидание активных фрагментов

По умолчанию 1m (одна минута). Это гарантирует, что Elasticsearch ожидает не менее времени таймаута, прежде чем завершить работу с ошибкой. Фактическое время ожидания может быть больше, особенно при множественных ожиданиях.

wait_for_active_shards

(Необязательно, строка) Количество копий фрагментов, которые должны быть активны перед продолжением операции. Установите значение all или любое положительное целое число до общего количества фрагментов в индексе (number_of_replicas+1). По умолчанию: 1, основной фрагмент.

См. Активные фрагменты.

Тело запроса

Тело запроса содержит список действий create, delete, index и update, разделённых символом новой строки, и связанные с ними исходные данные.

create

(Необязательно, строка) Индексирует указанный документ, если он ещё не существует. Следующая строка должна содержать исходные данные для индексирования.

_index
(Необязательно, строка) Название потока данных, индекса или псевдонима индекса, на котором нужно выполнить действие. Этот параметр обязателен, если <target> не указан в пути запроса.
_id
(Необязательно, строка) Идентификатор документа. Если идентификатор не указан, идентификатор документа генерируется автоматически.
require_alias
(Необязательно, логическое значение) Если true, действие должно быть направлено на псевдоним индекса. По умолчанию: false.
dynamic_templates
(Необязательно, карта) Карта из полных имён полей в имена динамических шаблонов. По умолчанию пустая карта. Если имя соответствует динамическому шаблону, этот шаблон применяется независимо от других предикатов соответствия, определённых в шаблоне. И если поле уже определено в отображении, этот параметр не будет использован.
delete

(Необязательно, строка) Удаляет указанный документ из индекса.

_index
(Необязательно, строка) Название потока данных, индекса или псевдонима индекса, на котором нужно выполнить действие. Этот параметр обязателен, если <target> не указан в пути запроса.
_id
(Обязательно, строка) Идентификатор документа.
require_alias
(Необязательно, логическое значение) Если true, действие должно быть направлено на псевдоним индекса. По умолчанию: false.
index

(Необязательно, строка) Индексирует указанный документ. Если документ существует, заменяет документ и увеличивает версию. Следующая строка должна содержать исходные данные для индексирования.

_index
(Необязательно, строка) Название потока данных, индекса или псевдонима индекса, на котором нужно выполнить действие. Этот параметр обязателен, если <target> не указан в пути запроса.
_id
(Необязательно, строка) Идентификатор документа. Если идентификатор не указан, идентификатор документа генерируется автоматически.
require_alias
(Необязательно, логическое значение) Если true, действие должно быть направлено на псевдоним индекса. По умолчанию: false.
dynamic_templates
(Необязательно, карта) Карта из полных имён полей в имена динамических шаблонов. По умолчанию пустая карта. Если имя соответствует динамическому шаблону, этот шаблон применяется независимо от других предикатов соответствия, определённых в шаблоне. И если поле уже определено в отображении, этот параметр не будет использован.
update

(Необязательно, строка) Выполняет частичное обновление документа. Следующая строка должна содержать частичный документ и опции обновления.

_index
(Необязательно, строка) Название потока данных, индекса или псевдонима индекса, на котором нужно выполнить действие. Этот параметр обязателен, если <target> не указан в пути запроса.
_id
(Обязательно, строка) Идентификатор документа.
require_alias
(Необязательно, логическое значение) Если true, действие должно быть направлено на псевдоним индекса. По умолчанию: false.
doc
(Необязательно, объект) Частичный документ для индексирования. Обязателен для операций update.
<fields>
(Необязательно, объект) Исходные данные документа для индексирования. Обязателен для операций create и index.

Тело ответа

Ответ API для пакетных операций содержит отдельные результаты каждой операции в запросе, возвращаемые в порядке их отправки. Успех или неудача одной операции не влияет на другие операции в запросе.

took
(целое число) Время обработки пакетного запроса в миллисекундах.
errors
(Булево) Если true, одна или несколько операций в пакетном запросе не завершились успешно.
items

(массив объектов) Содержит результат каждой операции в пакетном запросе в порядке их отправки.

Свойства объектов items
<action>

(объект) Имя параметра — это действие, связанное с операцией. Возможные значения — create, delete, index и update.

Значение параметра — это объект, содержащий информацию об ассоциированной операции.

Свойства <action>
_index
(строка) Имя индекса, связанного с операцией. Если операция была направлена на поток данных, это базовый индекс, в который был записан документ.
_type
(строка) Тип документа, связанный с операцией. Индексы Elasticsearch теперь поддерживают единственный тип документа: _doc. См. Удаление типов отображения.
_id
(целое число) Идентификатор документа, связанный с операцией.
_version

(целое число) Версия документа, связанная с операцией. Версия документа увеличивается каждый раз при обновлении документа.

Этот параметр возвращается только для успешных действий.

result
(строка) Результат операции. Успешные значения — created, deleted и updated. Другие допустимые значения — noop и not_found.
_shards

(объект) Содержит информацию о фрагментации для операции.

Этот параметр возвращается только для успешных операций.

Свойства _shards
total
(целое число) Количество фрагментов, на которых операция пыталась выполнить.
successful
(целое число) Количество фрагментов, на которых операция выполнилась успешно.
failed
(целое число) Количество фрагментов, на которых операция пыталась выполнить, но не выполнилась.
_seq_no

(целое число) Номер последовательности, назначенный документу для операции. Номера последовательностей используются для обеспечения того, чтобы более старая версия документа не перезаписывала более новую версию. См. Оптимистический контроль конкуретности.

Этот параметр возвращается только для успешных операций.

_primary_term

(целое число) Основной термин, назначенный документу для операции. См. Оптимистический контроль конкуретности.

Этот параметр возвращается только для успешных операций.

status
(целое число) HTTP-код состояния, возвращенный для операции.
error

(объект) Содержит дополнительную информацию об ошибочной операции.

Этот параметр возвращается только для ошибочных операций.

Свойства error
type
(строка) Тип ошибки для операции.
reason
(строка) Причина неудачи операции.
index_uuid
(строка) Универсальный уникальный идентификатор (UUID) индекса, связанного с ошибочной операцией.
shard
(строка) Идентификатор фрагмента, связанного с ошибочной операцией.
index
(строка) Имя индекса, связанного с ошибочной операцией. Если операция была направлена на поток данных, это базовый индекс, в который пытались записать документ.

Примеры

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

API возвращает следующий результат:

{
   "took": 30,
   "errors": false,
   "items": [
      {
         "index": {
            "_index": "test",
            "_type": "_doc",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 201,
            "_seq_no" : 0,
            "_primary_term": 1
         }
      },
      {
         "delete": {
            "_index": "test",
            "_type": "_doc",
            "_id": "2",
            "_version": 1,
            "result": "not_found",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 404,
            "_seq_no" : 1,
            "_primary_term" : 2
         }
      },
      {
         "create": {
            "_index": "test",
            "_type": "_doc",
            "_id": "3",
            "_version": 1,
            "result": "created",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 201,
            "_seq_no" : 2,
            "_primary_term" : 3
         }
      },
      {
         "update": {
            "_index": "test",
            "_type": "_doc",
            "_id": "1",
            "_version": 2,
            "result": "updated",
            "_shards": {
                "total": 2,
                "successful": 1,
                "failed": 0
            },
            "status": 200,
            "_seq_no" : 3,
            "_primary_term" : 4
         }
      }
   ]
}
Пример обновления

При использовании действия update, retry_on_conflict может использоваться в качестве поля самого действия (а не в дополнительной строке полезной нагрузки), чтобы указать, сколько раз следует повторить попытку обновления в случае конфликта версий.

Полезная нагрузка действия update поддерживает следующие опции: doc (частичный документ), upsert, doc_as_upsert, script, params (для скрипта), lang (для скрипта) и _source. Подробности об опциях см. в документации по обновлению. Пример с действиями обновления:

POST _bulk
{ "update" : {"_id" : "1", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
{ "update" : { "_id" : "0", "_index" : "index1", "retry_on_conflict" : 3} }
{ "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
{ "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
{ "update" : {"_id" : "3", "_index" : "index1", "_source" : true} }
{ "doc" : {"field" : "value"} }
{ "update" : {"_id" : "4", "_index" : "index1"} }
{ "doc" : {"field" : "value"}, "_source": true}
Пример с ошибочными действиями

Следующий пакетный запрос API включает операции, которые обновляют несуществующие документы.

POST /_bulk
{ "update": {"_id": "5", "_index": "index1"} }
{ "doc": {"my_field": "foo"} }
{ "update": {"_id": "6", "_index": "index1"} }
{ "doc": {"my_field": "foo"} }
{ "create": {"_id": "7", "_index": "index1"} }
{ "my_field": "foo" }

Поскольку эти операции не могут завершиться успешно, API возвращает ответ со флагом errors, установленным в значение true.

Ответ также содержит объект error для любых неудачных операций. Объект error содержит дополнительную информацию об ошибке, например, тип ошибки и причину.

{
  "took": 486,
  "errors": true,
  "items": [
    {
      "update": {
        "_index": "index1",
        "_type" : "_doc",
        "_id": "5",
        "status": 404,
        "error": {
          "type": "document_missing_exception",
          "reason": "[_doc][5]: document missing",
          "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
          "shard": "0",
          "index": "index1"
        }
      }
    },
    {
      "update": {
        "_index": "index1",
        "_type" : "_doc",
        "_id": "6",
        "status": 404,
        "error": {
          "type": "document_missing_exception",
          "reason": "[_doc][6]: document missing",
          "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
          "shard": "0",
          "index": "index1"
        }
      }
    },
    {
      "create": {
        "_index": "index1",
        "_type" : "_doc",
        "_id": "7",
        "_version": 1,
        "result": "created",
        "_shards": {
          "total": 2,
          "successful": 1,
          "failed": 0
        },
        "_seq_no": 0,
        "_primary_term": 1,
        "status": 201
      }
    }
  ]
}

Чтобы вернуть только информацию об ошибочных операциях, используйте параметр запроса filter_path со значением items.*.error.

POST /_bulk?filter_path=items.*.error
{ "update": {"_id": "5", "_index": "index1"} }
{ "doc": {"my_field": "baz"} }
{ "update": {"_id": "6", "_index": "index1"} }
{ "doc": {"my_field": "baz"} }
{ "update": {"_id": "7", "_index": "index1"} }
{ "doc": {"my_field": "baz"} }

API возвращает следующий результат.

{
  "items": [
    {
      "update": {
        "error": {
          "type": "document_missing_exception",
          "reason": "[_doc][5]: document missing",
          "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
          "shard": "0",
          "index": "index1"
        }
      }
    },
    {
      "update": {
        "error": {
          "type": "document_missing_exception",
          "reason": "[_doc][6]: document missing",
          "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
          "shard": "0",
          "index": "index1"
        }
      }
    }
  ]
}
Пример с параметром dynamic templates

В приведенном ниже примере создается динамическая шаблон, а затем выполняется пакетный запрос, состоящий из запросов index/create с параметром dynamic_templates.

PUT my-index/
{
  "mappings": {
    "dynamic_templates": [
      {
        "geo_point": {
             "mapping": {
                "type" : "geo_point"
             }
        }
      }
    ]
  }
}

POST /_bulk
{ "index" : { "_index" : "my_index", "_id" : "1", "dynamic_templates": {"work_location": "geo_point"}} }
{ "field" : "value1", "work_location": "41.12,-71.34", "raw_location": "41.12,-71.34"}
{ "create" : { "_index" : "my_index", "_id" : "2", "dynamic_templates": {"home_location": "geo_point"}} }
{ "field" : "value2", "home_location": "41.12,-71.34"}

Пакетный запрос создает два новых поля work_location и home_location типа geo_point в соответствии с параметром dynamic_templates; однако поле raw_location создается с помощью стандартных правил динамического отображения, в данном случае как поле типа text, поскольку оно передается как строка в JSON-документе.

© 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-bulk.html

Spec-Zone.ru

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