- Серия Elasticsearch: 3. Первые шаги, хранение и отображение данных
- ОТДЕЛЬНЫЙ API
- Кибана
- Статус кластера
- Создать индекс
- Создать сопоставление
- Сохранить документ
- Поискдокумент
- Форма ответа
- Формат запроса
- Людек Веселы
- Поделиться этой публикацией
- Серия Elasticsearch: 4. Полнотекстовый поиск на чешском языке
- Серийный номер Elasticsearch: 2. Установка
Серия Elasticsearch: 3. Первые шаги, хранение и отображение данных
В этой части мы познакомимся с базовым функционалом Elasticsearch — создадим индекс, сохраним первые документы и будем их искать.
Обязательным условием является наличие запущенных Elasticsearch и Kibana — вы можете найти процедуру установки в предыдущей главе.
ОТДЕЛЬНЫЙ API
Взаимодействует с Elasticsearch через REST API. Благодаря этому можно запрашивать данные без необходимости установки специального клиента, некоторые запросы можно выполнять, просто введя соответствующий URL-адрес в веб-браузере. Для других действий можно использовать, например, консольный инструмент curl. Все данные отправляются и принимаются в формате JSON. Однако для эффективной работы целесообразнее использовать один из инструментов с графическим интерфейсом, например Postman или Kibana.
Кибана
В следующих примерах я буду выполнять все запросы с помощью инструмента Kibana. Он включает подсветку синтаксиса, автоматическое форматирование запросов, шепот при формулировании запроса и просмотр истории выполненных запросов. На данный момент это, вероятно, лучший инструмент для запросов к Elasticsearch.
Откройте http://localhost:5601 в веб-браузере и перейдите на вкладку Инструменты разработчика . Появится краткая справка, нажмите синюю кнопку «Приступить к работе», чтобы продолжить. Теперь доступны две панели — в левой можно написать вопрос, в правой — посмотреть ответы. Написанный запрос можно запустить либо нажав на зеленую стрелку, либо нажав CMD+Enter в случае OS X. Попробуем запустить подготовленный запрос GET _search напрямую. Он будет искать все документы, хранящиеся в Elasticsearch.
Статус кластера
Еще до того, как мы начнем хранить данные в Elasticsearch, мы можем узнать, как выглядит весь кластер (в нашем случаеобразован одним узлом). Под статусом мы подразумеваем как правильно ли работает Elasticsearch без ошибок, так и какие индексы и типы документов он содержит. В документации рекомендуется использовать запросы:
чтобы узнать статус
Однако они не возвращают данные в явном виде. Для этой цели удобнее использовать отображение состояния в инструменте Cerebro, доступном по адресу http://localhost:9000.
Создать индекс
Во-первых, необходимо создать индекс, чтобы вообще было где хранить данные. Это можно сделать с помощью метода HTTP PUT, за которым следует имя индекса и его настройки. Давайте создадим индекс продуктов, в котором мы будем хранить продукты, которые мы будем искать позже.
Запустите эту команду в Kibana, она создаст индекс с именем products . Созданный индекс будет иметь один сегмент и не иметь реплик в зависимости от используемых настроек. Проще говоря, при такой настройке не может происходить репликация данных, что подходит для локальной разработки на одной машине. В производственной среде настройка будет отличаться в зависимости от доступного оборудования — мы вернемся к этому в последующих главах этой серии.
При запуске команды в Kibana можно написать несколько запросов друг под другом. Таким образом, мы можем выполнять несколько запросов и выполнять их, не открывая новое окно браузера. Таким образом, вы можете запустить приведенный выше запрос, а затем проверить результат выполненной операции с помощью другого запроса. Например, мы проверяем настройки созданного индекса, запрашивая GET products/_settings. Если все пошло не так, как мы ожидали, индекс можно удалить с помощью продуктов DELETE и продолжить, отредактировав предыдущие команды:
Выполненные запросы можно просмотреть, нажав «История» в правом верхнем углу Kibana. Не проблема вернуться к форме сделанного ранее запроса и работать над ним дальше.
Состояние созданных индексовтем не менее, гораздо проще использовать инструмент Cerebro. Перейдите по адресу http://localhost:9000, вы увидите всю необходимую информацию о кластере:
На данный момент для нас важна таблица, содержащая созданные индексы. Если вы не видите индекс .kibana, просто установите флажок .special (1). В этой таблице вы можете увидеть созданные индексные продукты, состоящие из одного сегмента. Если щелкнуть раскрывающийся список рядом с названием индекса, появится меню, ведущее к просмотру настроек индекса, его редактированию, статистике и другим параметрам. В Cerebro нет ничего такого, чего Elasticsearch не может сделать самостоятельно, только графически визуализируются данные и возможно редактирование ряда настроек через готовые формы.
Вы можете увидеть желтую полосу в заголовке, что означает, что кластер не на 100 % работоспособен. Это связано с тем, что определена реплика индекса .kibana. Создавать его негде, потому что весь кластер состоит из одного компьютера. Чтобы исправить это, просто вызовите меню (раскрывающееся меню) для индекса .kibana, продолжите настройку индекса и затем установите для index.number_of_replicas значение 0. После нажатия кнопки «Сохранить» статус кластера должен быть зеленым в заголовке страницы.
Создать сопоставление
Elasticsearch не содержит схемы, а это значит, что при хранении документов нет необходимости заранее определять их форму — она создается автоматически при индексации документов. Однако на практике мы обычно хотим определить схему документа заранее. Причина проста — мы захотим работать с каждым полем по-своему, чего Elasticsearch не может знать заранее. Например, мы хотим искать название продукта в полном тексте, но мы хотим искать только имя производителя по точному совпадению, было бы неэффективно хранить оба поля, обрабатываемые одинаково.
Для этого необходимо сначала создать сопоставление (mapping) — определить егоструктура документа. Документы с новыми полями, не описанными в сопоставлении, по-прежнему могут быть проиндексированы. Однако в одном индексе одно поле всегда должно иметь один и тот же тип, иначе сохранить новый документ не удастся. При создании сопоставления необходимо определить, для какого индекса и типа оно создается, какие поля каких типов данных оно содержит и как индексируются поля для полнотекстового поиска, если применимо.
Создание простого сопоставления продуктов может выглядеть следующим образом:
Здесь мы создаем тип продуктов в индексе продуктов. В этом типе будут храниться документы, содержащие целочисленный идентификатор, заголовок, сохраненный в виде текста, и название бренда, сохраненное в виде ключевого слова. В обоих случаях (текст и ключевое слово) это текстовая строка, но в первом случае предполагается полнотекстовый поиск, и поэтому строка сохраняется обработанной для этой цели. Во втором случае текст сохраняется как есть — предполагается поиск по точному совпадению (для фильтрации по производителям на сайте будет использоваться чекбокс, а не ввод текста).
Сохранить документ
Теперь созданный индекс может сохранять документы, которые мы будем искать позже. Документ можно сохранить следующим образом:
При сохранении методом POST новые документы всегда создаются с автоматически генерируемым уникальным идентификатором _id. Если мы хотим использовать наш идентификатор, запрос должен быть изменен с помощью метода PUT:
Сохраненные документы затем можно искать с помощью GET /products/products/_search :
Сохраненные документы имеют автоматически сгенерированный идентификатор _id. Если бы мы хотели навязать им свой id, то достаточно было бы добавить его в используемый эндпоинт и использовать метод PUT:
То, что документы сохранились, также можно проверить в Cerebro — информация о количестве продуктов будет добавлена под названием индекс продуктов: docs: 2 .
Поискдокумент
Я подробно расскажу о полнотекстовом поиске в следующей главе, а сейчас мы будем искать сохраненные документы только с целью понимания формулировки поиска.
При поиске отправляется запрос GET на конечную точку http://localhost:9200/products/products/_search , где products сначала указывается имя индекса, затем имя типа. Можно не указывать имя типа и индекса — тогда он будет искаться во всем индексе или во всем кластере. Все документы будут найдены в актуальном виде, для собственно поиска нужно сформулировать форму запроса. Если бы мы хотели найти термин Gorenje в названиях продуктов, запрос выглядел бы так:
Здесь мы ищем этот результат в полном тексте и только в заголовке. В результате был найден один совпадающий продукт, независимо от регистра. Однако, если вы будете искать холодильники, вы не найдете ни одного товара. Это связано с использованием настроек по умолчанию, когда Elasticsearch не знает, что он должен работать с чешским языком.
Мы также можем выполнить поиск по названию бренда, хранящемуся в поле бренда. В данном случае нас интересует только точное совпадение, к тому же имя сохраняется как ключевое слово. Поэтому мы используем термин вместо соответствия:
Разницу между запросами соответствия и термина можно сравнить с вопросом о том, соответствует ли продукт заданному термину (да или нет -> термин ) или насколько он соответствует заданному термину (соответствие).
Форма ответа
На запросы, сделанные выше, мы получаем следующий ответ:
Ответ сверху содержит:
- take : время в мс, затраченное на выполнение запроса
- timed_out : Информация о том, все ли было сделано в установленное время
- _shards: информация об осколках, на которых был выполнен запрос
- _hits : Результаты поиска (найденные документы)
.
Тогда массив _hits содержит массив, в котором формируется каждый элемент:
- _index : Индекс, в котором хранится найденный документ
- _type : Тип, в котором хранится документ
- _id : идентификатор сохраненного документа
- _score : степень соответствия документа запросу
- _source : сохраненный документ
Формат запроса
Однако при поиске в Elasticsearch нам потребуется дополнительно манипулировать результатами — сортировать их, разбивать на страницы. Поэтому сам запрос должен быть расширен дополнительными частями, в то время как наиболее часто используемые включают в себя:
- запрос: сам запрос
- size : Количество возвращенных документов, аналогично LIMIT из SQL, значение по умолчанию 10
- from: смещение при возврате документов аналогично смещению из SQL
- sort : определение того, как сортировать результаты
- aggs : Агрегация — расчеты по всем документам, соответствующим запросу (минимальная/максимальная цена, список брендов)
Типичный запрос к Elasticsearch, содержащий вышеуказанные поля, может выглядеть следующим образом:
После запуска мы получим первые максимум 5 найденных товаров, отсортированных по id. Далее в поле aggs получаем список всех доступных брендов.
На данный момент мы можем запускать запросы к Elasticsearch для создания документов, а затем искать их. В следующей главе вы узнаете, как организовать полнотекстовый поиск на чешском языке.
Людек Веселы
Поделиться этой публикацией
Серия Elasticsearch: 4. Полнотекстовый поиск на чешском языке
Во-первых, общий полнотекстовый поиск. Вероятно, самый известный способ «полнотекстового» поиска — это использование оператора LIKE %% в реляционной базе данных. Этот…
Серийный номер Elasticsearch: 2. Установка
Первое необходимое условие для работы с Elasticsearch — это его загрузка и запуск. Есть и другие способы заставить его работать и…
Luděk Veselý © 2022 С гордостью опубликовано с Ghost