КатегорииElasticsearch

Elasticsearch Введение — 1.2 Взаимодействие

Взаимодействие с Elasticsearch

Основной способ взаимодействия с Elasticsearch — REST API. По умолчанию API — интерфейс Elasticsearch работает на порту 9200. Api можно классифицировать на следующие виды:

  • API документов: CRUD (Create Retrieve Update Delete) операции с документами
  • API поиска: поиск чего бы то ни было
  • API Индексов: управление индексами (создание, удаление …)
  • API Cat: вместо JSON данных возвращаются в табличном виде
  • API кластера: для управления кластером

Для каждого вида в дальнейшем будет отдельный урок. А сейчас мы рассмотрим некоторые основные CRUD операции API документов. Этот раздел представляет собой просто краткое введение о том, как управлять данными с помощью API документов. Кроме того стоит заметить, что есть клиентские библиотеки для большинства популярных языков программирования. По сути они являются оберткой вокруг REST API.

Для примера представим, что мы создаем интернет магазин. И хотим использовать Elasticsearch в качестве поиска. Мы будем использовать индекс с именем example1 и хранить все продукты  в типе product. Каждый продукт, который мы хотим индексировать, представляет собой JSON документ. И начнем с создания нового документа о продукте, затем запросим информацию о нем по его идентификатору, потом обновим данные в нем и в завершении удалим.

Создание документа

Новый документ можно добавить с помощью API документов. Например чтобы добавить новый товар можно выполнить следующий запрос. Тело запроса — это документ продукта, который мы хотим добавить.

PUT http://localhost:9200/example1/product/1
{
  "title": "Мой розовый дневник",
  "author": "Роман Одуванчиков",
  "category": "books"
}

Elasticsearch автоматически создаст индекс example1 и тип product если они еще не существуют.

В ответ на запрос выше мы получим следующее:

{
   "_index": "example1",
   "_type": "product",
   "_id": "1",
   "_version": 1,
   "_shards": {
     "total": 1,
     "successful": 1,
     "failed": 0
   },
   "created": true
 }

В ответе мы увидим, что Elasticsearch создал документ с версией 1 + доп информация о том куда добавился документ. Поскольку мы создали документа с использованием HTTP метода PUT нам необходимо было задать id документа иначе мы получим ошибку.

No handler found for uri [/example1/product/] and method [PUT]

Если у вас нет уникального идентификатора, вы можете использовать HTTP POST тогда Elasticsearc создаст уникальный id за вас. Например:

POST http://localhost:9200/example1/product/
{
  "title": "Мой розовый дневник",
  "author": "Роман Одуванчиков",
  "category": "books"
}

Ответ:

{
  "_index": "example1",
  "_type": "product",
  "_id": "AV1hL8Dq3Zz-g306rrqI",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

Собственно вот и созданный id AV1hL8Dq3Zz-g306rrqI. Если попробовать сделать запрос PUT и передать уже существующий id, произойдет замена документа и увеличение параметра _version:

{
   "_index": "example1",
   "_type": "product",
   "_id": "AV1hL8Dq3Zz-g306rrqI",
   "_version": 2,
   "_shards": {
     "total": 1,
     "successful": 1,
     "failed": 0
   },
   "created": false
 }

Как вы заметили created = false, а _version = 2.

Получение существующего документа

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

GET http://localhost:9200/example1/product/1
{
  "_index": "example1",
  "_type": "product",
  "_id": "1",
  "_version": 2,
  "found": true,
  "_source": {
    "title": "Мой розовый дневник",
    "author": "Роман Одуванчиков",
    "category": "books"
  }
}

Как видите результат содержит не только сам документ который храниться в полу _source, но и дополнительная информация, например что документ был найден found = true, текущая версия _version = 2 напомню, что она увеличивается каждый раз при изменении документа.

Обновление существующего документа

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

Существуют разные способы обновление документа, подробно мы разберем эту тему на других уроках. А пока рассмотрим основы.

Частичное обновление документа

Давайте обновим категорию у недавно созданного документа:

 POST http://localhost:9200/example1/product/1/_update
 {
 "doc": {
     "category": "trash"
   }
 }
{
  "_index": "example1",
  "_type": "product",
  "_id": "1",
  "_version": 3,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

«result»: «updated» значит все прошло успешно, заметьте _version тоже увеличилось. Доступны более сложные сценарии обновления, но как я уже говорил рассмотрим их позже.

 Удаление существующего документа

Для удаления существующего документа нам необходимо использовать HTTP метод DELETE передав в него путь, как для получения документа.

DELETE http://localhost:9200/example1/product/1

Ответ:

{
  "found": true,
  "_index": "example1",
  "_type": "product",
  "_id": "1",
  "_version": 4,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

result = deleted, значит операция прошла успешно и документ был удален.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *