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

Почему русскоязычный поиск часто промахивается
Проблема обычно простая: человек вводит понятный запрос, а в первых результатах видит "почти то", но не то. Он редко будет переформулировать запрос пять раз. Чаще он уйдет или напишет в поддержку. Поэтому релевантность на практике сводится к одному: нашел ли пользователь нужное в первых 3-5 результатах.
На русском промахи случаются чаще, потому что один и тот же смысл выражают десятками форм. "Оплата счета", "оплатить счет", "счета к оплате", "счетик" - для человека это рядом, а для поиска это может быть совсем разный текст. Если система плохо работает с морфологией русского языка, она начинает наказывать пользователя за естественную речь.
Вторая причина - написание. Запросы приходят с опечатками, пропущенными буквами, смешением е/ё, слитным и раздельным написанием. Добавьте ошибочную раскладку и транслит - и поиск уверенно показывает результаты по совпадению пары букв, а нужные документы не поднимает наверх.
Представьте: в базе знаний есть статья "Возврат товара: сроки и условия". Пользователь пишет "вазврат тавора срок" или "vozvrat tovara" и ждет ответ сразу. Если поиск не учитывает такие варианты, он может поднять "товарный знак" или "сроки доставки", потому что там больше точных совпадений.
Важно заранее понимать, какой у вас тип поиска. От этого меняются и правила релевантности:
- Товары и услуги: важны атрибуты, синонимы, фильтры.
- Статьи и новости: важны заголовки, рубрики, свежесть.
- База знаний и FAQ: важны формулировки "как сделать" и устойчивость к ошибкам в запросах.
- Внутренние документы: важны сокращения, номера, названия отделов.
Если вы настраиваете русскоязычный поиск с помощью ИИ, ему не стоит "догадываться", что считать одинаковым. Гораздо надежнее дать примеры, рамки и исключения, а потом проверить выдачу по тестовым запросам.
Морфология: какие вариации запроса считать одним смыслом
В русском языке один и тот же предмет легко превращается в десятки словоформ. Для поиска это означает простую вещь: пользователь пишет "стол", а в карточке товара стоит "стола" или "столом", и без нормальной морфологии выдача начинает вести себя странно.
Сначала решите, какие формы вы считаете одним смыслом. Чаще всего это все падежи и числа у обычных существительных: "стол", "стола", "столом", "столы". То же относится к названиям ролей и профессий: "менеджер", "менеджера", "менеджеры". Для прилагательных важнее согласование: "новая", "новое", "новые" обычно должны вести к одним и тем же результатам.
С предлогами аккуратнее. "В Москве", "по Москве", "из Москвы" звучат похоже, но намерение может отличаться. В каталоге услуг "доставка по Москве" и "доставка из Москвы" - разные сценарии. Поэтому предлоги лучше не "съедать" автоматически: сначала проверьте на своих данных, где это помогает, а где путает.
Отдельная боль - составные слова и дефисы. Пользователь может написать "онлайн-касса", "онлайн касса" или даже "онлайнкасса". Если вы управляете релевантностью через ИИ, полезно заранее зафиксировать правило: дефис, пробел и слитное написание считаем эквивалентными, но только для списка известных составных терминов.
С фамилиями и брендами не ломайте точные совпадения. Склоняемые фамилии могут выглядеть как разные слова, а бренд иногда важнее морфологии.
Практичный компромисс выглядит так:
- Для обычных слов включайте лемматизацию (все словоформы к базовой форме).
- Для брендов, артикулов, моделей оставляйте точный режим.
- Для географии учитывайте предлоги как отдельный сигнал смысла.
- Для дефисов задайте нормализацию и список исключений.
- Для редких терминов заведите небольшой "словарь равенств" (синонимы и варианты написания).
Опечатки и написание: что обязательно учесть
Опечатки в русскоязычном поиске почти всегда системные. Люди пишут с телефона, путают раскладку, смешивают слитное и раздельное, используют транслит. Если это не учесть, релевантность будет прыгать: один и тот же смысл то находится, то пропадает.
Самый частый класс ошибок - неправильная раскладка. Пользователь хотел "привет", а набрал "ghbdtn". Для поиска здесь важна не оценка таких слов, а умение привести ввод к нормальной форме запроса.
Вторая группа - соседние клавиши и лишние повторения. "првет", "москвва", "дрельь" выглядят как разные слова, но намерение одно. Такие ошибки хорошо ловятся, если вы допускаете небольшое "расстояние" между запросом и словом в данных.
Третья группа - пропуски и перестановки букв: "кфе", "коофе", "кофее". Здесь легко переборщить. Если разрешить слишком много замен, поиск начнет подмешивать нерелевантные результаты.
Отдельно стоит слитное и раздельное написание. "водонагреватель" и "водо нагреватель" должны вести к одним и тем же товарам или статьям. То же самое с дефисами и пробелами в брендах и моделях.
И еще один обязательный слой - транслит и смешанное письмо. "iphone", "айфон" и "aifon" часто означают одно и то же, особенно в каталогах и поддержке.
Практичный минимум, который стоит заложить:
- нормализация раскладки (ru-en) и обратно;
- обработка 1-2 опечаток на слово (соседние клавиши, лишняя буква);
- правила для пробелов и дефисов (слитно-раздельно);
- словарь транслита для популярных терминов и брендов;
- защита от "слишком умного" исправления, чтобы не ломать точные запросы.
Пример из жизни: в базе есть "водонагреватель Ariston", а в поддержку пишут "djlj yfuhtdftnkm fhbcnty" или "водо нагреватель аристон". Если поиск приводит эти варианты к одной форме и при этом не ломает точные совпадения, пользователю не приходится угадывать правильное написание.
Разберите запросы на типы, чтобы ИИ не гадал
Поиск начинает "угадывать", когда все запросы смешаны в одну кучу. Один и тот же текст может означать разные действия: "айфон 13 цена" - не то же самое, что "айфон 13 как настроить камеру". Если разложить запросы по типам, вы быстрее настроите релевантность и избежите странных результатов.
1) Интент: что человек хочет сделать
Начните с базового: человек хочет купить, узнать, сравнить или найти инструкцию. Интент часто выдают слова-маркеры: "купить", "заказать", "доставка", "как", "почему", "инструкция", "сравнить", "лучше", "топ".
Короткая практика: запрос "налоговый вычет документы" может означать "узнать, какие нужны" или "найти шаблон заявления". Это два разных ответа и часто два разных типа страниц.
2) Сущность и атрибуты: что именно ищут
Дальше выделите сущность: товар, услуга, статья, человек, город, документ. Затем атрибуты, которые уточняют выбор: модель, год, размер, цвет, цена, локация.
Удобно фиксировать запрос как "сущность + атрибуты + интент". Например, "кроссовки 42 черные недорого" - товар, атрибуты (размер, цвет, цена), интент (покупка). А "кроссовки 42 как выбрать" - та же сущность, но интент уже обучающий.
Отдельно отметьте "мусорные" добавки. "Отзывы", "фото", "скачать", "цена", "как" иногда помогают, а иногда только мешают. "Цена" в каталоге полезна, а в базе документов может уводить в нерелевантные материалы.
И еще два фактора, которые ломают простые правила: синонимы и разговорные слова. "Авто/машина", "зарплата/оклад", "детская/для ребенка". Если такие пары не зафиксировать, ИИ будет то расширять смысл слишком широко, то наоборот пропускать хорошие результаты.
Когда типы запросов описаны, их проще превращать в примеры для обучения: для каждого интента и сущности дайте несколько корректных формулировок и явно отметьте, какие атрибуты должны влиять на выдачу, а какие можно игнорировать.
Что подготовить до настройки: данные и словари
Релевантность чаще упирается не в "умность" алгоритма, а в качество входных данных. Если заранее собрать несколько простых списков, поиск начнет вести себя предсказуемо: меньше случайных совпадений, больше правильных ответов на разных формах слов и с ошибками.
Сначала составьте карту того, что вы вообще ищете. Это не про структуру сайта, а про сущности: категории, услуги, документы, роли, города, названия разделов, частые атрибуты. Сразу укажите варианты написания: "санкт-петербург", "спб", "питер", "петербург". Пользователи пишут по привычке, а не по справочнику.
Отдельно подготовьте список точных совпадений, где "похоже" недопустимо. Обычно это бренды, модели, артикулы, тарифы, номера договоров. Например, "Galaxy A54" не должен смешиваться с "A54s", а "Pro" - тянуть результаты для "Business". Такой словарь помогает жестко разделить зоны: где нужен строгий матч, а где можно включать морфологию.
Дальше решите, какие синонимы вы действительно считаете одним смыслом. "Оплата" и "платеж" часто можно объединить, а вот "заявка" и "жалоба" обычно нельзя. Короткий, но точный список почти всегда лучше огромного, который ломает выдачу.
Чтобы правки были измеримыми, соберите примеры плохих результатов. Запишите запрос, что пользователь ожидал увидеть, и что именно было не так: не тот раздел, перепутаны товары, слишком много "мусора", важный документ не поднялся в топ.
И наконец, зафиксируйте запреты: что нельзя показывать, что нельзя смешивать, и какие группы результатов должны быть раздельными. Это особенно важно, если поиск используется внутри продукта или личного кабинета.
Минимальный набор для старта:
- реестр категорий и ключевых сущностей с вариантами написания;
- словарь точных имен (бренды, модели, артикулы, тарифы);
- список разрешенных синонимов и "не-синонимов";
- коллекция кейсов с плохой выдачей и ожидаемым результатом;
- правила запретов и разделения результатов (если есть).
Как собрать набор тестовых запросов для проверки релевантности
Набор тестовых запросов нужен, чтобы проверять стабильность: поиск должен одинаково хорошо отвечать на "нормальные" формулировки, словоформы и мелкие ошибки.
Минимальный набор, который дает пользу быстро
Начните с 30-50 самых частых запросов из логов (или из подсказок, если логов нет). Разложите их по типам и сразу договоритесь, как оцениваете результат.
Сделайте это просто:
- для каждого запроса запишите ожидаемые 3-5 результатов (что должно быть в топе и что точно не должно);
- добавьте 1-2 реалистичных варианта словоформ (падеж, число, род);
- добавьте 1-2 варианта с ошибкой (опечатка, лишняя буква, неверная раскладка);
- отдельно пометьте запросы, где нужна точность: артикулы, коды, номера заявок.
Ожидания фиксируйте конкретно: "в топ-3 должна быть карточка товара X и категория Y". Если контент часто меняется, задавайте критерий вместо конкретной страницы: "любая страница с точным артикулом", "категория с этим брендом".
Запросы на точность держите отдельным блоком и проверяйте строже. Если "A123" вдруг превращается в "похожие товары", это не "чуть хуже", а поломка сценария.
Примеры запросов для морфологии: пары и вариации
Морфология меняет окончания, число и даже часть речи, но смысл запроса часто сохраняется. Чтобы модель не трактовала это на глаз, заранее решите, какие пары обязаны давать одинаковую выдачу.
Примеры, которые часто стоит включить в тестовый набор (ожидаем одинаковую выдачу):
- "доставка цветов" и "доставкой цветов" (падежные формы);
- "ремонт ноутбука" и "ремонт ноутбуков" (единственное и множественное);
- "заявка на подключение" и "подключиться" (существительное vs глагол, интент один);
- "оформление договора" и "договор оформить" (перестановка слов);
- "в Москве" и "Москва" (локация как фильтр или часть смысла).
Для каждой пары заранее уточните, что именно значит "одинаково". Например, "ремонт ноутбука" может вести на страницу услуги, а "ремонт ноутбуков" - на список сервисов или категорию. "В Москве" может включать фильтр город=Москва, а "Москва" иногда вводят как часть названия компании или события. В спорных случаях лучше считать запросы похожими, но не полностью эквивалентными.
Примеры запросов для опечаток, транслита и раскладки
Ошибки в русскоязычных запросах бывают разными. Важно не просто "чинить" ввод, а заранее решить, насколько далеко вы готовы отходить от исходного слова, чтобы не начать подсовывать лишнее.
Мини-набор тестов (запрос -> ожидаемое поведение)
- Опечатки по соседним клавишам: "кофе", "коофе", "кое". Первые два должны давать почти одинаковые результаты. Третий не должен полностью перетягиваться на "кофе", если в базе реально есть "кое-что".
- Неверная раскладка: "привет" и "ghbdtn". Решите заранее, когда включать автоисправление: всегда или только если иначе нет результатов.
- Транслит и бренды: "айфон", "iphone", "aifon". Желательно свести к одному представлению и одинаково ранжировать товары, статьи или инструкции.
- Слитно, раздельно, через дефис: "онлайн касса", "онлайн-касса", "онлайнкасса". Пользователь не должен зависеть от того, как термин написан в карточке товара.
- Похожие буквы: "елка" и "ёлка", "платье" и "платйе", случаи с "ь/ъ". Нормализация должна помогать, но не ломать редкие слова.
Правила, которые стоит зафиксировать
Чтобы ИИ не "угадывал", задайте рамки: максимальное число правок в слове, приоритет исправлений (раскладка vs опечатка), и что делать при конфликте (например, "мир" vs "сыр" при одной замене).
Простой ориентир: если у вас есть каталог и база знаний, по запросу "aifon 13 promax" человек чаще ожидает товар, а не статью про настройку. Значит, для брендовых слов и моделей полезно усиливать точные совпадения и словари вариантов написания.
Пошагово: как настраивать и проверять релевантность
Начинайте не с настроек, а с правил успеха. Один и тот же запрос можно считать "хорошо обработанным" по-разному: для навигации важен точный документ на 1 месте, для категорийных запросов важнее разнообразие, для справочных важно попадание в тему.
1) Зафиксируйте цель для каждого типа запроса
Коротко опишите, что должно оказаться в топе и как вы это проверяете. Удобно держать таблицу: запрос, тип, "идеальный ответ", допустимые альтернативы.
На старте обычно хватает таких критериев:
- Навигация (название товара/страницы): нужный результат на 1 месте.
- Категория: в топ-5 есть минимум 3 релевантных результата.
- Атрибуты (цвет, размер, город): включается фильтрация или появляется правильная группа результатов.
- Ошибки и раскладка: находится то же, что и по "правильному" запросу.
- Длинные запросы: ключевой смысл не теряется, даже если есть лишние слова.
Сохраните "базовую линию": снимок выдачи (хотя бы топ-10) и оценку по вашим правилам. Это точка отсчета, чтобы видеть не только улучшения, но и поломки.
2) Настраивайте по слоям, от простого к сложному
Сначала настройте текстовую обработку: нормализацию регистра, е/ё, лишние пробелы, лемматизацию или стемминг, словари синонимов (например, "СПб/Санкт-Петербург"). Важно: каждое изменение делайте отдельно и сразу перетестируйте.
Потом добавляйте опечатки. Задайте порог исправления и правила, когда исправлять нельзя (короткие слова, артикулы, точные модели). Проверьте раскладку и транслит: "ghbdtn" -> "привет", "moskva" -> "москва".
Когда базовые слои стабильны, подключайте ИИ-ранжирование там, где правила начинают спорить: длинные разговорные запросы вроде "айфон 13 не заряжается после обновления" или "доставка в питер сегодня". ИИ проще контролировать, если вход уже нормализован.
Финальный цикл простой: повторный прогон тестов, сравнение с базовой линией, фиксация изменений.
Частые ошибки, из-за которых поиск становится хуже
Поиск чаще портится не из-за одной большой проблемы, а из-за пары "улучшений", которые выглядят разумно, но ломают смысл.
1) Исправление опечаток слишком "смелое"
Если коррекция опечаток пытается любой ценой найти "похожее слово", начинают смешиваться разные товары и темы. Пользователь пишет "ланос стартер", а система исправляет и уводит в общие категории вместо нужной детали. Правило простое: лучше ничего не исправить, чем исправить в другую сущность.
2) Синонимы без контекста
Синонимы зависят от предметной области. В финтехе "аккаунт" и "счет" могут означать разные вещи. Если склеить их, вы получите много совпадений по словам, но не по смыслу.
3) Игнорирование точных запросов
Артикулы, номера моделей, коды ошибок, версии, серийники стоит обрабатывать отдельно. "E13", "P0420", "SM-G991B" нельзя размывать морфологией и "умными" синонимами. Для таких запросов точность важнее семантики.
4) Смешивание интентов
"Как выбрать ноутбук" и "купить ноутбук 16 ГБ" - разные намерения. Если ранжировать их одинаково, пользователи будут получать статьи вместо товара или товары вместо инструкции.
5) Нет эталона, тестируют только "идеальные" запросы
Если вы меняете правила и не ведете небольшой эталонный набор, вы не узнаете, стало ли лучше. Тесты только на чистых запросах тоже обманывают: реальность - это "айфон 13 чехолл", "sber spisanie", "вк парол забыл".
Чтобы русскоязычный поиск улучшался предсказуемо, держите короткий контрольный набор: 20-30 точных запросов (коды, модели), 20-30 "человеческих" (с вопросами), и 20-30 шумных (опечатки, раскладка, транслит).
Быстрый чеклист и следующие шаги
Перед тем как докручивать релевантность, проверьте, что у вас есть понятные проверки и правила, по которым вы принимаете изменения. Без этого поиск улучшают "на глаз", а потом сложно понять, почему стало хуже.
Короткий чеклист перед настройкой:
- Собран тестовый набор запросов: частые короткие, длинные "как в жизни", с опечатками, с брендами, с артикулами и моделями.
- Для каждого запроса записано, что считается правильным результатом (топ-1 или топ-3), и какие отклонения допустимы.
- Заранее определен режим точности для артикулов и моделей: где нужен строгий матч, а где можно "прощать" расхождения.
- Отдельно проверены словоформы (падежи, числа), раскладка (ghbdtn вместо привет), транслит (iphone/айфон), слитно-раздельно и дефисы.
- Назначен простой процесс: кто обновляет словари (синонимы, стоп-слова, бренды) и кто принимает изменения по итогам тестов.
Дальше переходите от списка проблем к повторяемому циклу улучшений: фиксируете кейс, добавляете правило, прогоняете тесты, сравниваете с базовой линией.
Обычно быстрый эффект дают три шага: один прогон тестов до изменений, правки маленькими порциями (1-3 изменения за раз), и обязательный повторный прогон с записью, сколько запросов стало лучше, хуже или без изменений.
Если вы собираете прототип поиска внутри TakProsto (takprosto.ai), удобно хранить такие правила и тестовые наборы рядом с проектом, а изменения проверять через snapshots и rollback, чтобы спокойно откатываться, если часть запросов просела.