Elasticsearch - API документов

Elasticsearch предоставляет API для одного документа и API для нескольких документов, где вызов API нацелен на один документ и несколько документов соответственно.

Индекс API

Это помогает добавить или обновить документ JSON в индексе, когда делается запрос к соответствующему индексу с определенным сопоставлением. Например, следующий запрос добавит объект JSON для индексации школ и в соответствии с отображением школ:

PUT schools/_doc/5
{
   name":"City School", "description":"ICSE", "street":"West End",
   "city":"Meerut",
   "state":"UP", "zip":"250002", "location":[28.9926174, 77.692485],
   "fees":3500,
   "tags":["fully computerized"], "rating":"4.5"
}

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 2,
   "_primary_term" : 1
}

Автоматическое создание индекса

Когда делается запрос на добавление объекта JSON к определенному индексу и если этот индекс не существует, этот API автоматически создает этот индекс, а также базовое сопоставление для этого конкретного объекта JSON. Эту функцию можно отключить, изменив значения следующих параметров на false, которые присутствуют в файле elasticsearch.yml.

action.auto_create_index:false
index.mapper.dynamic:false

Вы также можете ограничить автоматическое создание индекса, где разрешено только имя индекса с определенными шаблонами, изменив значение следующего параметра -

action.auto_create_index:+acc*,-bank*

Note - Здесь + означает разрешено, а - означает запрещенное.

Управление версиями

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

PUT schools/_doc/5?version=7&version_type=external
{
   "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan",
   "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405],
   "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3"
}

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "result" : "updated",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 3,
   "_primary_term" : 1
}

Управление версиями - это процесс в реальном времени, и на него не влияют операции поиска в реальном времени.

Есть два наиболее важных типа управления версиями:

Внутреннее управление версиями

Внутреннее управление версиями - это версия по умолчанию, которая начинается с 1 и увеличивается с каждым обновлением, включая удаления.

Внешнее управление версиями

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

Тип операции

Тип операции используется для принудительного создания операции. Это помогает избежать перезаписи существующего документа.

PUT chapter/_doc/1?op_type=create
{
   "Text":"this is chapter one"
}

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "chapter",
   "_type" : "_doc",
   "_id" : "1",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 0,
   "_primary_term" : 1
}

Автоматическая генерация ID

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

POST chapter/_doc/
{
   "user" : "tpoint",
   "post_date" : "2018-12-25T14:12:12",
   "message" : "Elasticsearch Tutorial"
}

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "chapter",
   "_type" : "_doc",
   "_id" : "PVghWGoB7LiDTeV6LSGu",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 1,
   "_primary_term" : 1
}

Получить API

API помогает извлекать объект типа JSON, выполняя запрос на получение определенного документа.

pre class="prettyprint notranslate" > GET schools/_doc/5

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "name" : "Central School",
      "description" : "CBSE Affiliation",
      "street" : "Nagan",
      "city" : "paprola",
      "state" : "HP",
      "zip" : "176115",
      "location" : [
         31.8955385,
         76.8380405
      ],
      "fees" : 2200,
      "tags" : [
         "Senior Secondary",
         "beautiful campus"
      ],
      "rating" : "3.3"
   }
}
  • Эта операция выполняется в режиме реального времени и не зависит от частоты обновления индекса.

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

  • Вы также можете указать _all в запросе, чтобы Elasticsearch мог искать этот идентификатор документа в каждом типе и возвращал первый совпавший документ.

  • Вы также можете указать поля, которые вы хотите получить в результате из этого конкретного документа.

GET schools/_doc/5?_source_includes=name,fees

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "fees" : 2200,
      "name" : "Central School"
   }
}

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

GET schools/_doc/5?_source

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "name" : "Central School",
      "description" : "CBSE Affiliation",
      "street" : "Nagan",
      "city" : "paprola",
      "state" : "HP",
      "zip" : "176115",
      "location" : [
         31.8955385,
         76.8380405
      ],
      "fees" : 2200,
      "tags" : [
         "Senior Secondary",
         "beautiful campus"
      ],
      "rating" : "3.3"
   }
}

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

Удалить API

Вы можете удалить определенный индекс, сопоставление или документ, отправив HTTP-запрос DELETE в Elasticsearch.

DELETE schools/_doc/4

Запустив приведенный выше код, мы получаем следующий результат -

{
   "found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2,
   "_shards":{"total":2, "successful":1, "failed":0}
}

Версия документа может быть указана для удаления этой конкретной версии. Можно указать параметр маршрутизации для удаления документа от конкретного пользователя, и операция завершится ошибкой, если документ не принадлежит этому конкретному пользователю. В этой операции вы можете указать параметр обновления и тайм-аута так же, как GET API.

Обновить API

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

POST schools/_update/4
{
   "script" : {
      "source": "ctx._source.name = params.sname",
      "lang": "painless",
      "params" : {
         "sname" : "City Wise School"
      }
   }
 }

Запустив приведенный выше код, мы получаем следующий результат -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "4",
   "_version" : 3,
   "result" : "updated",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 4,
   "_primary_term" : 2
}

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