Использование плагина yandex-lemmer в Yandex Managed Service for OpenSearch
С помощью плагина yandex-lemmer
вы можете добавить фильтр, который помогает улучшить поиск текста на русском языке по документам OpenSearch.
Чтобы оценить работу плагина, сравните результаты обычного поиска и поиска с фильтром yandex-lemmer
, а затем усовершенствуйте фильтр.
После тестирования удалите созданные ресурсы, если они вам больше не нужны.
Перед началом работы
-
Подготовьте инфраструктуру:
ВручнуюС помощью Terraform-
Создайте кластер Managed Service for OpenSearch нужной вам конфигурации со следующими настройками:
- Подключены плагины
yandex-lemmer
иanalysis-icu
. - Включен публичный доступ к группе хостов с ролью
DATA
.
- Подключены плагины
-
Если вы используете группы безопасности в кластере, убедитесь, что они настроены правильно и допускают подключение к кластеру.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации opensearch-yandex-lemmer.tf
. В файле описаны:- сеть;
- подсеть;
- группа безопасности и правила, необходимые для подключения к кластеру Managed Service for OpenSearch;
- кластер Managed Service for OpenSearch.
-
Укажите в файле
opensearch-yandex-lemmer.tf
переменные:version
— версия OpenSearch.admin_password
— пароль администратора OpenSearch.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
-
Проверьте подключение к кластеру с помощью утилиты cURL
:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --request GET 'https://<FQDN_хоста_OpenSearch_с_ролью_DATA>:9200/'
FQDN хоста можно получить со списком хостов в кластере.
При успешном подключении будет выведено похожее сообщение:
{ "name" : "....mdb.yandexcloud.net", "cluster_name" : "...", "cluster_uuid" : "...", "version" : { "distribution" : "opensearch", ... }, "tagline" : "The OpenSearch Project: https://opensearch.org/" }
Выполните поиск без использования yandex-lemmer
-
Добавьте документ в индекс
simple-index
:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request POST 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/simple-index/_doc?pretty' \ --data '{ "book": "Ночь, когда шел дождь", "author": "Юджиния Райли" }'
Индекс
simple-index
будет создан автоматически при создании документа. По умолчанию в индексах используется встроенный анализатор текстаStandard
. -
Выполните поиск:
curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request GET 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/simple-index/_search?pretty' \ --data '{ "query": { "query_string": { "query": "book: когда идут дожди" } } }'
Результат содержит строки:
... "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] } ...
Книга не найдена из-за расхождений в исходном документе и в поисковом запросе:
шел дождь
иидут дожди
.
Выполните поиск с использованием yandex-lemmer
-
Создайте индекс
lemmer-index
, в котором укажите параметры анализатораlemmer
и подключите его для поляbook
:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request PUT "https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/lemmer-index?pretty" \ --data '{ "mappings": { "properties": { "book": { "type": "text", "analyzer": "lemmer" } } }, "settings": { "analysis": { "analyzer": { "lemmer": { "type": "custom", "tokenizer": "standard", "filter": [ "yandex_lemmer" ] } } } } }'
-
Добавьте в индекс
lemmer-index
документ:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request POST 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/lemmer-index/_doc?pretty' \ --data '{ "book": "Ночь, когда шел дождь", "author": "Юджиния Райли" }'
-
Выполните поиск:
curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request GET 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/lemmer-index/_search?pretty' \ --data '{ "query": { "query_string": { "query": "book: когда идут дожди" } } }'
Результат содержит строки:
... "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.9993168, "hits" : [ { "_index" : "lemmer-index", "_id" : "zoGb_ZIB-3clfLPNjPbo", "_score" : 0.9993168, "_source" : { "book" : "Ночь, когда шел дождь", "author" : "Юджиния Райли" } } ] } ...
Книга найдена.
-
Чтобы посмотреть, как работает анализатор
lemmer
, выполните команду:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request GET 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/lemmer-index/_analyze?pretty' \ --data '{"field":"book","text":"шел дождь"}'
Результат:
{ "tokens" : [ { "token" : "шел", "start_offset" : 0, "end_offset" : 3, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "идти", "start_offset" : 0, "end_offset" : 3, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "дождь", "start_offset" : 4, "end_offset" : 9, "type" : "<ALPHANUM>", "position" : 1 } ] }
Токен
шел
после прохождения через фильтрyandex_lemmer
преобразуется в два токена:шел
— исходный токен;идти
— начальная форма словашел
.
Токен
дождь
после прохождения через фильтрyandex_lemmer
остается без изменений, т. к. исходный токен совпадает с начальной формой слова.
Усовершенствуйте поиск
Чтобы улучшить поиск текста, добавьте к yandex-lemmer
дополнительные фильтры:
nfc
— выполняет NFC-нормализацию (сопоставление текста), когда одна и та же буква представлена разными символами. Фильтр доступен при подключенном плагинеanalysis-icu
.lowercase
— преобразует текст в нижний регистр.yo_ye
— заменяет букву «ё» на «е». Фильтрyandex-lemmer
не различает эти буквы (найдутся иёлка
, иелка
), но такая замена позволяет улучшить процент попаданий в кеш анализатора и немного сэкономить дисковое пространство.
Чтобы использовать дополнительные фильтры:
-
Создайте индекс
index-with-filters
, в котором добавьте для анализатораlemmer-improved
фильтрyandex-lemmer
и дополнительные фильтры:curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request PUT "https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/index-with-filters?pretty" \ --data '{ "mappings": { "properties": { "book": { "type": "text", "analyzer": "lemmer-improved" } } }, "settings": { "analysis": { "filter": { "nfc": { "type": "icu_transform", "id": "NFC" }, "yo_ye": { "type": "pattern_replace", "pattern": "ё", "replacement": "е" } }, "analyzer": { "lemmer-improved": { "type": "custom", "tokenizer": "standard", "filter": [ "nfc", "lowercase", "yo_ye", "yandex_lemmer" ] } } } } }'
-
Добавьте в индекс документ:
curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request POST "https://<адрес_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/index-with-filters/_doc?pretty" \ --data '{ "book": "Чёрный тюльпан", "author": "Александр Дюма" }'
Здесь в названии книги вместо буквы «й» используются буква «и» (код 1048) и бревис
«˘» (код 774). -
Выполните поиск:
curl \ --user admin:<пароль> \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --request GET 'https://<адрес_хоста_OpenSearch_с_ролью_DATA>:9200/index-with-filters2/_search?pretty' \ --data '{ "query": { "query_string": { "query": "book: черный тюльпан" } } }'
Здесь в названии книги указана буква «й» (код 1049).
Результат содержит строки:
... "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.2876821, "hits" : [ { "_index" : "index-with-filters2", "_id" : "34EO_pIB-3clfLPNvvbY", "_score" : 0.2876821, "_source" : { "book" : "Чёрный тюльпан", "author" : "Александр Дюма" } } ] } ...
Книга найдена.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-