Взаимодействие с данными ElasticSearch при помощи операций CRUD

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

В этой статье речь пойдёт о взаимодействии с ElasticSearch.

Требования

Основы работы ElasticSearch

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

ElasticSearch предоставляет RESTful API, с которым можно взаимодействовать; в основном этот тип интерфейса описывает способ взаимодействия клиента и сервера. Серверы REST позволяют взаимодействовать с данными при помощи операций HTTP (GET, POST, PUT, DELETE) и не хранят информацию о состоянии. Каждый запрос является независимым; ресурсы возвращаются в общих текстовых форматах (таких как JSON).

API-интерфейс ElasticSearch позволяет взаимодействовать с данными при помощи HTTP-глаголов и передает параметры и информацию посредством использования компонентов URI. Это означает, что он хранит данные на основе того, как отформатированы URI.

При типичном взаимодействии с ElasticSearch нужно указать используемую операцию, чтобы определить, какие действия будут выполнены на данных. Чтобы извлечь информацию, можно использовать команду GET. Чтобы создать или обновить записи, используются команды PUT или POST.

Методы CRUD

CRUD расшифровывается как «Create, Read, Update, Delete». Все эти операции необходимы для продуктивного управления постоянным хранилищем данных. Кроме того, они эквивалентны методам HTTP, благодаря чему их можно использовать для взаимодействия с данными с помощью стандартных методов. Методы CRUD реализованы с помощью методов HTTP (POST, GET, PUT, DELETE).

API-интерфейс ElasticSearch позволяет выполнять все эти операции.

Рассмотрим работу ElasticSearch подробнее. Для примера можно использовать curl, поскольку:

  • метод HTTP можно указать явно,
  • взаимодействовать с ElasticSearch можно в терминальной сессии.

По умолчанию ElasticSearch работает на порте сервера 9200.

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

Создание объектов в ElasticSearch обычно называется индексацией. Это простой процесс добавления данных в хранилище и распределение их по категориям. Создавать объекты в ElasticSearch можно при помощи HTTP-методов PUT или POST.

В своей простейшей форме команда может содержать индекс, тип и идентификатор хранящегося объекта. В целом она имеет такой вид:

curl -X PUT http://server_name.com:9200/index/type/object_id -d '{ <document data> }'

В этом случае, индекс можно рассматривать как базу данных. Это единица верхнего уровня, которая может отделить некоторый блок информации от других; к примеру, это позволяет отделить данные приложения от данных сайта.

Тип в данном случае – это произвольная категоризация. Вы можете создавать разные типы, основное назначение которых – группировка определенной информации. Например, можно создать типы данных «users» или «documents».

Id нужно указать при создании команды PUT; команда POST генерирует id автоматически.

После флага –d нужно указать объект, который нужно сохранить. Это JSON-подобный объект, имеющий гибкий формат. Категории создаются на ходу, потому можете указать любую категорию.

К примеру, индекс для оборудования детских площадок может иметь такой вид:

curl -XPUT "http://localhost:9200/playground/equipment/1" -d ' { "type": "slide", "quantity": 2 }'

В случае если операция выполнена успешно, программа должна вернуть:

{"ok":true,"_index":"playground","_type":"equipment","_id":"1","_version":1}

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

Команда PUT также позволяет обновлять информацию. Чтобы указать, что запись нужно создать, а не обновить, используйте сегмент /_create:

curl -XPUT "http://localhost:9200/playground/equipment/1/_create" -d '{ "type": "slide", "quantity": 2 }'

Если такой документ уже существует, API вернёт ошибку:

{"error":"DocumentAlreadyExistsException[[playground][2] [equipment][1]: document already exists]","status":409}

Чтение данных

Все внесённые данные в дальнейшем можно извлечь. Для чтения контента используется HTTP-метод GET.

Основной синтаксис извлечения данных содержит индекс, тип и id:

curl -XGET "http://localhost:9200/playground/equipment/1"

Эта команда выведет сохранённую ранее информацию. Ключевое слово _source в выводе указывает источник данных:

{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true, "_source" :  { "type": "slide", "quantity": 1 }}

Чтобы получить вывод в более удобном для восприятия формате, добавьте в конец запроса опцию ?pretty:

curl -XGET "http://localhost:9200/playground/equipment/1?pretty"
{
"_index" : "playground",
"_type" : "equipment",
"_id" : "1",
"_version" : 2,
"exists" : true, "_source" : { "type": "slide", "quantity": 1 }
}

Чтобы получить только сам документ, добавьте в запрос /_source:

curl -XGET "http://localhost:9200/playground/equipment/1/_source?pretty"
{ "type": "slide", "quantity": 1 }

Чтобы вывести определённые поля, добавьте в запрос ?fields=<field1>,<field1>:

curl -XGET "http://localhost:9200/playground/equipment/1?fields=type"

Эта команда вернёт отфильтрованный вывод:

{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true,"fields":{"type":"slide"}}

Обновление контента

Для обновления контента используется HTTP-команда POST, которая позволяет изменять данные при помощи скриптов и параметров. Также для этого можно использовать команду PUT, которая, по сути, пересоздаёт объект, заменяя его новой версией.

Чтобы обновить данные при помощи команды POST, нужно добавить в URI опцию /_update. Для обозначения объекта используются ключи script и params. Команда может ссылаться на внутренние ключи документа при помощи префикса ctx._source.

К примеру, чтобы обновить количество горок на детской площадке, можно ввести:

curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.quantity += step", "params": { "step": 1 } }'

Попробуйте теперь извлечь данные и обратите внимание на количество:

curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"slide","quantity":3}

Чтобы добавить новое поле, нужно просто обновить объект и присвоить значение новому ключу:

curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.name_of_new_key = \"value of new field\"" }'

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

Чтобы удалить поле, используйте метод .remove, задав имя ненужного поля:

curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.remove(\"name_of_new_key\")" }'

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

curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "doc" : { "type": "swing" } }'

Чтобы убедиться, что всё прошло успешно, запросите документ:

curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"swing","quantity":3}

Удаление контента

ElasticSearch удаляет данные/документы по их ID. Для этого используется HTTP-метод DELETE.

К примеру, чтобы удалить созданный ранее документ с ID 36, нужно набрать:

curl -XDELETE "http://localhost:9200/playground/equipment/36"
{"ok":true,"found":true,"_index":"playground","_type":"equipment","_id":"36","_version":2}

Это означает, что операция прошла успешно. Если объекта с указанным в команде ID не существует, команда вернёт такой результат:

{"ok":true,"found":false,"_index":"playground","_type":"equipment","_id":"36","_version":1}

Ключ found сообщает, был ли найден и обработан запрашиваемый объект.

Поиск данных

Для поиска объектов используется компонент /_search. Его можно добавлять после сервера, индекса или типа в зависимости от области, которую нужно найти.

К примеру, чтобы найти на сервере все данные с количеством 4, нужно ввести:

curl -XGET "http://localhost:9200/_search?q=quantity:4'
{"took":5,"timed_out":false,"_shards":{"total":25,"successful":25,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"playground","_type":"equipment","_id":"1","_score":1.0, "_source" : {"type":"slide","quantity":4}}]}}

Чтобы получить удобный для восприятия вывод, используйте опцию pretty:

curl -XGET "http://localhost:9200/_search?q=quantity:4&pretty"
{
"took" : 14,
"timed_out" : false,
"_shards" : {
"total" : 25,
"successful" : 25,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "playground",
"_type" : "equipment",
"_id" : "1",
"_score" : 1.0, "_source" : {"type":"slide","quantity":4}
} ] }
}

Чтобы выполнить поиск только в определённых полях, а остальные поля исключить, добавьте в поиск индекс и тип URI:

curl -XGET "http://localhost:9200/playground/equipment/_search?q=quantity:4&pretty"

Чтобы указать тип, но исключить индекс, замените индекс компонентом _all:

curl -XGET "http://localhost:9200/_all/equipment/_search?q=quantity:4&pretty"

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

curl -XGET "http://localhost:9200/playground/equipment/_search" -d '{ "query": { "term": { "type": "slide" } } }'

Заключение

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

ElasticSearch – очень гибкое средство для быстрой индексации объектов; его функции почти безграничны с точки зрения его способности генерировать результаты поиска.

Эта статья знакомит вас только с некоторыми основными понятиями ElasticSearch. Его можно использовать как инструмент для быстрого поиска, а можно создать сложный объект индексации для детального поиска информации.

Tags: , ,

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