# Украинский лемматизатор теперь встроен в Manticore Search

Украинская лемматизация в Manticore Search теперь работает без отдельного Python-стека: используйте morphology='lemmatize_uk' или morphology='lemmatize_uk_all' и обычные языковые пакеты.

## Кратко

Начиная с релиза Manticore Search `25.7.1`, украинский лемматизатор больше не требует отдельного Python-стека.
Раньше нужно было устанавливать отдельный пакет, Python 3.9, `pymorphy2` и украинские словари.
Хорошая новость — теперь словарь уже входит в Manticore.

Достаточно только явно включить морфологию:

```sql
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` и работаете дальше.

## Минимальная конфигурация

Создадим таблицу для украинских текстов:

```sql
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`.

## Проверим на примере

Добавим несколько документов:

```sql
INSERT INTO uk_docs VALUES
  (1, 'мрії про червону сукню'),
  (2, 'каталог інтернет-магазину'),
  (3, 'команд-учасниць запросили на зустріч');
```

Запрос `мрія` находит документ, где слово записано как `мрії`:

```sql
SELECT id, title FROM uk_docs WHERE MATCH('мрія') ORDER BY id ASC;
```

```text
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    1 | мрії про червону сукню    |
+------+---------------------------+
```

Запрос `червоний` находит `червону`:

```sql
SELECT id, title FROM uk_docs WHERE MATCH('червоний') ORDER BY id ASC;
```

```text
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    1 | мрії про червону сукню    |
+------+---------------------------+
```

А `інтернет-магазин` находит `інтернет-магазину`:

```sql
SELECT id, title FROM uk_docs WHERE MATCH('інтернет-магазин') ORDER BY id ASC;
```

```text
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    2 | каталог інтернет-магазину |
+------+---------------------------+
```

## Что происходит с токенами

Если хочется посмотреть не только результат поиска, но и саму нормализацию, используйте `CALL KEYWORDS`:

```sql
CALL KEYWORDS(
  'мрії червона інтернет-магазину команд-учасниць',
  'uk_docs'
);
```

```text
+------+--------------------+--------------+
| 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](https://manual.manticoresearch.com/Creating_a_table/NLP_and_tokenization/Morphology#morphology).
