Использование плагина yandex-lemmer в Managed Service for OpenSearch
Примечание
В регионе Казахстан доступна только зона доступности kz1-a.
С помощью плагина yandex-lemmer вы можете добавить фильтр, который помогает улучшить поиск текста на русском языке по документам OpenSearch.
Чтобы оценить работу плагина, сравните результаты обычного поиска и поиска с фильтром yandex-lemmer, а затем усовершенствуйте фильтр.
После тестирования удалите созданные ресурсы, если они вам больше не нужны.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за кластер Managed Service for OpenSearch: использование вычислительных ресурсов, выделенных хостам (в том числе хостам с ролью
MANAGER), и дискового пространства (см. тарифы OpenSearch). - Плата за публичные IP-адреса для хостов кластера (см. тарифы Virtual Private Cloud).
Перед началом работы
-
Подготовьте инфраструктуру:
ВручнуюС помощью 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.kz", "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-манифестах, будут удалены.
-