Стемминг, стоп-слова и языки

Разбираем токен-фильтры, которые делают поиск умным: стемминг, стоп-слова и языковые анализаторы.

Стемминг — приведение слова к основе, чтобы разные формы одного слова стали одним термом и находились вместе.

Проблема словоформ

В русском «кофемашина», «кофемашины», «кофемашине», «кофемашин» — одно слово в разных падежах и числах. Без обработки это четыре разных терма, и поиск по одной форме не найдёт другие. Стемминг решает это: все формы приводятся к общей основе, например кофемашин, и попадают в индекс как один терм.

Стемминг в действии

Исходное словоТерм после стемминга
кофемашинакофемашин
кофемашиныкофемашин
работатьработа
работающийработа

Теперь запрос «кофемашины» тоже приводится к кофемашин и находит все формы. Обратите внимание: основа — не обязательно «правильное» слово, это просто общий корень для группировки.

Стоп-слова

Слова «и», «в», «на», «the», «a» встречаются почти везде и не несут смысла для поиска. Их называют стоп-словами и обычно выбрасывают на этапе токен-фильтров: они только раздувают индекс и не помогают различать документы. Для каждого языка свой список.

Языковые анализаторы

Встроенный standard делает нижний регистр и базовую токенизацию, но не делает стемминг и не знает стоп-слов конкретного языка. Для текста на русском нужно явно указать анализатор russian в маппинге:

{
  "mappings": {
    "properties": {
      "title": { "type": "text", "analyzer": "russian" }
    }
  }
}

Анализатор russian добавляет русский стеммер и русские стоп-слова, поэтому поиск начинает понимать падежи и склонения.

Как работает под капотом

Стемминг — это токен-фильтр в конце конвейера анализатора. Он применяет алгоритм (для русского обычно Snowball/Porter) к каждому токену, отсекая окончания и суффиксы по правилам языка. Стоп-фильтр просто удаляет токены из словаря стоп-слов. Поскольку и при индексации, и при поиске работает один анализатор, форма слова в запросе и в документе приводятся к одной основе — и совпадают на уровне термов.

Частые ошибки

  • Оставить standard для русского текста. Поиск будет искать буквальные формы: «купить» не найдёт «куплю». Признак беды — пользователи жалуются, что поиск «не понимает падежи».
  • Чрезмерный стемминг. Агрессивный стеммер может склеить разные по смыслу слова в одну основу и выдавать лишнее. Это компромисс между полнотой и точностью.
  • Стоп-слова там, где они важны. Во фразовом поиске или в названиях («The Who», «To be or not to be») вырезанные стоп-слова ломают смысл.

Итоги

  • Стемминг приводит словоформы к общей основе, чтобы поиск находил все формы слова.
  • Стоп-слова (частые незначимые слова) выбрасываются, чтобы не раздувать индекс.
  • Для русского текста нужен анализатор russianstandard не делает стемминг и не знает стоп-слов языка.
Проверьте себя
1. Что делает стемминг?
AПереводит текст на другой язык
BПриводит разные формы слова к общей основе, чтобы они стали одним термом
CУдаляет все короткие слова
DШифрует токены
2. Какой анализатор нужен, чтобы поиск по русскому тексту понимал падежи?
Astandard
Bkeyword
Crussian
Dsimple