Стемминг, стоп-слова и языки
Разбираем токен-фильтры, которые делают поиск умным: стемминг, стоп-слова и языковые анализаторы.
Стемминг — приведение слова к основе, чтобы разные формы одного слова стали одним термом и находились вместе.
Проблема словоформ
В русском «кофемашина», «кофемашины», «кофемашине», «кофемашин» — одно слово в разных падежах и числах. Без обработки это четыре разных терма, и поиск по одной форме не найдёт другие. Стемминг решает это: все формы приводятся к общей основе, например кофемашин, и попадают в индекс как один терм.
Стемминг в действии
| Исходное слово | Терм после стемминга |
| кофемашина | кофемашин |
| кофемашины | кофемашин |
| работать | работа |
| работающий | работа |
Теперь запрос «кофемашины» тоже приводится к кофемашин и находит все формы. Обратите внимание: основа — не обязательно «правильное» слово, это просто общий корень для группировки.
Стоп-слова
Слова «и», «в», «на», «the», «a» встречаются почти везде и не несут смысла для поиска. Их называют стоп-словами и обычно выбрасывают на этапе токен-фильтров: они только раздувают индекс и не помогают различать документы. Для каждого языка свой список.
Языковые анализаторы
Встроенный standard делает нижний регистр и базовую токенизацию, но не делает стемминг и не знает стоп-слов конкретного языка. Для текста на русском нужно явно указать анализатор russian в маппинге:
{
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "russian" }
}
}
}Анализатор russian добавляет русский стеммер и русские стоп-слова, поэтому поиск начинает понимать падежи и склонения.
Как работает под капотом
Стемминг — это токен-фильтр в конце конвейера анализатора. Он применяет алгоритм (для русского обычно Snowball/Porter) к каждому токену, отсекая окончания и суффиксы по правилам языка. Стоп-фильтр просто удаляет токены из словаря стоп-слов. Поскольку и при индексации, и при поиске работает один анализатор, форма слова в запросе и в документе приводятся к одной основе — и совпадают на уровне термов.
Частые ошибки
- Оставить standard для русского текста. Поиск будет искать буквальные формы: «купить» не найдёт «куплю». Признак беды — пользователи жалуются, что поиск «не понимает падежи».
- Чрезмерный стемминг. Агрессивный стеммер может склеить разные по смыслу слова в одну основу и выдавать лишнее. Это компромисс между полнотой и точностью.
- Стоп-слова там, где они важны. Во фразовом поиске или в названиях («The Who», «To be or not to be») вырезанные стоп-слова ломают смысл.
Итоги
- Стемминг приводит словоформы к общей основе, чтобы поиск находил все формы слова.
- Стоп-слова (частые незначимые слова) выбрасываются, чтобы не раздувать индекс.
- Для русского текста нужен анализатор
russian—standardне делает стемминг и не знает стоп-слов языка.