DRAFT: Yandex Cloud Managed OpenSearch - part I
Mikhail KhludnevПривет. Сегодня говорим о Managed OpenSearch Yandex Cloud.
Некоторые вопросы использования Managed OpenSearch в Yandex Cloud
Managed Open Search в минимальной (неотказоустойчивой) конфигурации стоит около 15 тыс. руб. в месяц.
Для окружения разработки можно останавливать кластер Open Search на ночь чтобы немного сэкономить. Для этого можно создать два cron триггер вызывающих Cloud Function с payload “start” и ”stop”. Моя Cloud Function на Python использует REST API для остановки и запуска кластера. Функция может получать Bearer token от сервисного аккаунта под которым она запускается из контекста вызова через context.token["access_token"]}. Сервисному аккаунту функции нужна соответствующая роль для остановки, запуска кластера Open Search. Разумеется не стоит делать эту функцию публичной. Как вариант, Bash функция может использовать yc для запуска и остановки кластера. Не помню почему я остановился на Python. Оставляйте комментарии если тут нужны какие-то детали и пояснения.
<Код Start Stop Open Search Cloud Function.py>
Ещё можно сэкономить отказавшись от публично доступного узла DASHBOARD.Чаще всего в нём используют notebook-like клиента DevTools. Вместо этого запросы можно отправлять на DATA хосты (включив публичный доступ) с помощью curl-like клиента, например Insomnia или мой любимый. Не забудьте установить хороший пароль и создать пользователей с необходимыми полномочиями!
Кстати насчёт пароля, кажется более правильный способ подключения к кластеру уже предоставлен в UI консоли управления но ещё полностью не документирован. Ссылка ведёт на Metadata Hub. Напишу отдельный пост когда познакомлюсь с ним.
Лемматизатор
Из интересных плагинов в Yandex Cloud можно упомянуть yandex-lemmer предоставляющий морфологию русского языка, это позволяет искать нормальные начальные формы слов вместо посимвольного сравнения. Следующий пост, кстати будет посвящён альтернативному решению проблемы «поиска по смыслу, а не по буквам».
Тем не менее, если включить yandex lemmer plugin в настройках кластера, можно сравнить его с примитивным стеммером. Выберем наиболее трудные случаи для стеммера. Кстати, забыл мой любимый случай «фланцы–фланец», приберегу на следующий раз:
// тест классического алгоритмического стеммера
POST /_analyze?filter_path=tokens.token
{
"tokenizer": "standard",
"filter": [
"russian_stem"
],
"text": "бежит письмо пеку переоформляющих радио"
}
// ответ - неправильные стеммы в yaml формате
tokens:
- token: "беж"
- token: "письм"
- token: "пек"
- token: "переоформля"
- token: "рад"
// тест лемматизатора с морфологией
POST /_analyze?filter_path=tokens.token
{
"tokenizer": "standard",
"filter": [
"yandex_lemmer"
],
"text": "бежит письмо пеку переоформляющих радио"
}
// ответ: морфологически правильные леммы
tokens:
- token: "бежит"
- token: "бежать"
- token: "письмо"
- token: "пеку"
- token: "пек"
- token: "печь"
- token: "переоформляющих"
- token: "переоформлять"
- token: "радио"
Как исключить исходные токены из потока, я найти не смог.
Давайте сравним этот лемматизатор с заслуженным морфологическим анализатором hunspell со словорями LibreOffice. К сожалению пока невозможно использовать hunspell в YC Managed OpenSearch, так как нет возможности скопировать файлы словарей. см. ниж. Зато он бесплатно доступен для тех кто пока не пользуется Managed OpenSearch. Если скопировать ru_RU.aff, ru_RU.dic в каталог config/hunspell/ru_RU на локально запущенном OpenSearch, получим отличное качество стемм (ну или лемм):
GET http://localhost:9200/_analyze?filter_path=tokens.token
Content-Type: application/json
Accept: application/yaml
{
"tokenizer": "standard",
"filter": [
{
"type": "hunspell",
"lang": "ru_RU"
}
],
"text": "бежит письмо пеку переоформляющих радио"
}
tokens:
- token: "бежать"
- token: "письмо"
- token: "пек"
- token: "печь"
- token: "переоформляющий"
- token: "радио"
Срочная новость: Оказалось в Managed OpenSearch уже установлены и работают hunspell словари ru_RU, en_GB, может быть ещё какие-то есть, проверьте.
Отдав должное заслуженным NLP методам в следующем посте перейдём к использованию языковых моделей.