Кратко
Начиная с релиза Manticore Search 25.7.1, украинский лемматизатор больше не требует отдельного Python-стека.
Раньше нужно было устанавливать отдельный пакет, Python 3.9, pymorphy2 и украинские словари.
Хорошая новость — теперь словарь уже входит в Manticore.
Достаточно только явно включить морфологию:
morphology='lemmatize_uk_all'
Отдельно добавлять украинские символы в charset_table тоже уже не нужно: стандартный non_cont содержит маппинги для є, і, ї, ґ.
А вот апостроф для украинского языка важен, но здесь есть один важный нюанс. Если просто добавить его в charset_table, это может затронуть данные на английском языке, где апостроф тоже используется.
Именно поэтому для украинских текстов мы рекомендуем использовать отдельную таблицу со своим charset_table и апострофом, а не смешивать украинский с английским или другими языками в одной таблице.
Это всё, что нужно учесть для полноценной поддержки украинского в ManticoreSearch. Никаких словарей, пакетов или скриптов. Теперь всё работает прямо "из коробки"
Что такое лемматизатор
В полнотекстовом поиске часто нужно найти слово не только в той форме, которую ввёл пользователь. В документе может быть мрії, а пользователь ищет мрія. Или в тексте лежит інтернет-магазину, а запрос приходит как інтернет-магазин. Для человека это очевидно близкие формы. Для поискового движка без морфологии это разные токены.
Для этого в поисковых движках используют стемминг и лемматизацию.
Стеммер обычно работает по правилам: убирает или заменяет окончание. Это быстро, но результат бывает грубым и не всегда похож на настоящее слово.
Лемматизатор использует словарь и морфологию, чтобы получить нормальную форму слова. Для украинского языка это особенно заметно из-за падежей, рода и числа.
Что изменилось
Если вы уже пробовали украинскую лемматизацию в Manticore, то могли упереться не в сам поиск, а в установку:
- отдельный
manticore-lemmatizer-uk; - Python 3.9 с
--enable-shared; pymorphy2иpymorphy2-dicts-uk;- дополнительные системные зависимости.
Теперь украинский словарь поставляется как обычный языковой файл uk.pak, а Manticore загружает его нативно. С вашей стороны всё сводится к настройке таблицы: указываете нужную morphology и работаете дальше.
Минимальная конфигурация
Создадим таблицу для украинских текстов:
CREATE TABLE uk_docs(title text)
morphology='lemmatize_uk_all'
charset_table='non_cont,U+0027';
Здесь важно включить морфологию:
morphology='lemmatize_uk_all'включает украинский лемматизатор и индексирует все найденные нормальные формы.
Для украинского языка добавляем только апостроф (U+0027), чтобы слова вроде обов'язковим индексировались как один токен.
Если нужна только одна нормальная форма, используйте lemmatize_uk. Если хотите индексировать все возможные формы, используйте lemmatize_uk_all.
Проверим на примере
Добавим несколько документов:
INSERT INTO uk_docs VALUES
(1, 'мрії про червону сукню'),
(2, 'каталог інтернет-магазину'),
(3, 'команд-учасниць запросили на зустріч');
Запрос мрія находит документ, где слово записано как мрії:
SELECT id, title FROM uk_docs WHERE MATCH('мрія') ORDER BY id ASC;
+------+---------------------------+
| id | title |
+------+---------------------------+
| 1 | мрії про червону сукню |
+------+---------------------------+
Запрос червоний находит червону:
SELECT id, title FROM uk_docs WHERE MATCH('червоний') ORDER BY id ASC;
+------+---------------------------+
| id | title |
+------+---------------------------+
| 1 | мрії про червону сукню |
+------+---------------------------+
А інтернет-магазин находит інтернет-магазину:
SELECT id, title FROM uk_docs WHERE MATCH('інтернет-магазин') ORDER BY id ASC;
+------+---------------------------+
| id | title |
+------+---------------------------+
| 2 | каталог інтернет-магазину |
+------+---------------------------+
Что происходит с токенами
Если хочется посмотреть не только результат поиска, но и саму нормализацию, используйте CALL KEYWORDS:
CALL KEYWORDS(
'мрії червона інтернет-магазину команд-учасниць',
'uk_docs'
);
+------+--------------------+--------------+
| qpos | tokenized | normalized |
+------+--------------------+--------------+
| 1 | мрії | мрія |
| 2 | червона | червоний |
| 3 | інтернет | інтернет |
| 4 | магазину | магазин |
| 5 | команд | команда |
| 6 | учасниць | учасниця |
+------+--------------------+--------------+
Здесь видно главное отличие от простого отрезания окончаний: на выходе получаются нормальные формы слов, с которыми уже можно искать. мрії превращается в мрія, червона в червоний, магазину в магазин.
Что нужно помнить
Украинский лемматизатор стало проще использовать, но он не включается сам для любой таблицы. Нужно явно задать morphology.
Стандартный charset_table=non_cont уже покрывает украинские символы є, і, ї, ґ. Если вы задаёте таблицу именно для украинских текстов, достаточно добавить к нему апостроф: charset_table='non_cont,U+0027'.
Если вы используете официальные пакеты или образы Manticore Search актуальной версии, украинский uk.pak уже должен быть на месте. Если у вас собственная сборка или нестандартная раскладка файлов, проверьте, что lemmatizer_base указывает на каталог, где лежит uk.pak.
Подробнее о настройке морфологии можно прочитать в документации: morphology .
