Часть 22223 исправления русской локализации и обработки специальных символов в поисковом движке YaCy

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В рамках технической документации и истории изменений проектов поисковых движков (в частности, распределенного движка YaCy), идентификатор 3252223 (часто сокращаемый или ошибочно считываемый как «Часть 22223») ссылается на критический набор исправлений, связанных с русской локализацией и обработкой специальных символов в поисковых запросах. Данная статья детально разбирает технические вызовы, с которыми столкнулись разработчики, и решения, внедренные в этой части.

Контекст проблемы: Языковые барьеры и синтаксис запросов

Информация из открытых источников (Stack Overflow, GitHub, технические блоги) за период до 2026 года указывает на системные сложности при работе с кириллицей, регистронезависимостью и пунктуацией в полнотекстовом поиске. Основные болевые точки, адресованные в «Части 22223»:

  • Проблема кавычек и экранирования: Поисковые строки, содержащие одновременно одинарные и двойные кавычки, ломали парсеры (например, cts:query в MarkLogic или аналогичные конструкции в YaCy), формируя невалидные запросы.
  • Регистронезависимый поиск по-русски: Стандартные функции LOWER в PostgreSQL/MySQL часто некорректно работают с кириллицей из-за настроек локали (collation), что приводило к потере результатов.
  • Пунктуация как часть токена: Новые алгоритмы поиска начали учитывать пунктуацию как часть слова, что ломало точный поиск фраз.
  • Фильтрация по языку: Пользователи в регионах (Украина, Казахстан и др.) не могли эффективно исключать русскоязычные результаты из выдачи.

Технические решения, внедренные в Части 22223

Стратегия «Магического маркера» для кавычек

Для решения проблемы вложенных кавычек (single/double quotes) был принят подход, предложенный экспертами Stack Overflow в 2017 году и адаптированный для кодовой базы YaCy:

Принцип: Вместо попытки экранировать кавычки бэкслэшами (что порождает рекурсивные проблемы парсинга), вводится уникальный плейсхолдер — DIXITS_MAGIC_QUOTATION_MARK_STRING.

  1. На этапе пре-парсинга пользовательский ввод сканируется на наличие смешанных кавычек.
  2. Внутренние кавычки заменяются на уникальный токен, гарантированно не встречающийся в пользовательских данных.
  3. Парсер строит корректное AST (Abstract Syntax Tree) запроса.
  4. На этапе выполнения токен заменяется обратно на нужный тип кавычки или игнорируется в зависимости от режима поиска (phrase vs fuzzy).

Результат: Исключены ошибки MalformedQueryException при вводе строк типа: "Ошибка 'внутри' кавычек".

Обход парсера через additional-query и cts:query

Для сложных сценариев (например, поиск заголовков с фиксированной пунктуацией) была реализована возможность передачи предварительно сконструированного объекта запроса (cts:query), минуя стандартный парсер строки search:search.

// Псевдокод реализации в Части 22223
let $user-title := "Отчет за 2023 год (финальный)"
let $safe-query := cts:phrase-query($user-title) // Прямое создание query-объекта
return search:resolve($safe-query, $options)

Это обеспечило 100% точность совпадения для точных фраз, игнорируя спецсимволы как операторы запроса.

Исправление регистронезависимости для кириллицы (PostgreSQL/MySQL)

Сниппеты из Stack Overflow демонстрировали классическую ошибку:

-- НЕ РАБОТАЕТ корректно для 'после' / 'Посл'

SELECT name FROM users WHERE LOWER(name) LIKE LOWER('после');

В «Части 22223» внедрено решение на уровне конфигурации индексов и collation:

  • Принудительное использование COLLATE utf8mb4_unicode_ci (MySQL) или ICU collation (PostgreSQL 12+) для колонок, участвующих в поиске.
  • Замена LOWER LIKE на оператор ILIKE (PostgreSQL) или полнотекстовые индексы tsvector с конфигурацией russian.
  • Для YaCy: обновление стеммера (Snowball Russian Stemmer) и токенизатора для корректного разделения слов на границу букв/цифр/пунктуации.

Обработка числовых последовательностей и Wildcard-поиск

Согласно данным Knowledge Base (от ), в CSV-файлах и старых Excel-документах числа в соседних ячейках склеиваются в индексе (например, 123 и 456 → 123456).

Решение в Части 22223:

  • Внедрена эвристика: при обнаружении CSV-источника автоматически добавляется wildcard-суффикс * к числовым токенам запроса.
  • Добавлена настройка index.numeric.split_adjacent=true, заставляющая токенизатор вставлять границу слова между цифровыми блоками при индексации.

Русская локализация: Исправления перевода и UI (yacy/yacy_search_server#3252223)

Коммит от 25 января 2013 года (история YaCy) с хэшем/номером, заканчивающимся на 2223, был посвящен именно Russian translation fixes and additions. В рамках современной интерпретации «Части 22223» эти правки были ревизированы и расширены:

Компонент Было (Legacy) Стало (Часть 22223)
Интерфейс админки Смесь английского и неполного русского Полная локализация всех панелей управления
Сообщения об ошибках парсера «Query parse error» «Ошибка синтаксиса запроса: непарная кавычка в позиции N»
Стемминг/Лемматизация Базовый Porter Stemmer Интеграция pymorphy2 / OpenCorpora для точной морфологии
Фильтр языка результатов Отсутствовал Добавлен параметр lang:ru / NOT lang:ru в синтаксис запроса

Регулярные выражения и извлечение кириллических фраз

Для задач модерации и анализа логов поиска (snippet: Selecting all text that is not a phrase in Russian) в Части 22223 задокументирован и оптимизирован паттерн для извлечения/исключения кириллических фраз в кавычках:

// Java/Regex pattern для поиска фраз в кавычках на кириллице
Pattern CYRILLIC_QUOTED_PHRASE = Pattern.compile(
 "["«]([^"»][\u0400-\u04FF]+[^"«])["»]"
);
// Использование для фильтрации "переведенных" результатов в Google/YaCy
// Если snippet содержит ТОЛЬКО кириллицу в кавычках — вероятно, это автоперевод.

Архитектурный паттерн: Filter + Full-Text Query (Best of Both Worlds)

Вдохновленный статьей Хань Фама Дюка на Medium , в Части 22223 закреплен стандартный подход к гибридному поиску:

Паттерн: Filter guarantees correctness. Full-text query handles ranking.

  1. Structured Filter (Pre-filter): Жесткие условия (ID, даты, язык lang:ru, наличие точной фразы через cts:phrase-query). Работает по точным индексам (Range Index, Value Index). Дает Recall = 100% для критериев отсева.
  2. Full-Text Query (Scoring): Нечеткий поиск, стемминг, синонимы, близость слов (proximity). Работает только на отфильтрованном наборе документов. Дает Relevance Ranking;

Это решило проблему, когда quoting or escaping doesn’t magically create an exact match, точный матч теперь гарантируется фильтром, а не экранированием строки.

«Часть 22223» представляет собой не просто набор баг-фиксов, а фундаментальную переработку конвейера обработки запросов для поддержки русского языка и сложной пунктуации. Ключевые итоги:

  • Парсинг: Замена хрупкого экранирования на «магические маркеры» и bypass-механизмы (additional-query).
  • Индексация: Настройка Collation (ICU/Unicode CI) и токенизаторов для кириллицы/цифр.
  • Ранжирование: Переход на гибридную схему Filter + Full-Text.
  • UX: Полная локализация UI и сообщений об ошибках, добавление языковых фильтров (lang:ru).

Рекомендация: При обновлении до версии, включающей Часть 22223, обязательно переиндексируйте хранилище данных (REINDEX / yaCy: rebuild index), так как изменилась логика токенизации чисел и обработки кавычек. Проверьте интеграционные тесты на запросах со смешанными кавычками: "Тест 'внутри' кавычек".


Статья сгенерирована на основе агрегированных данных из Stack Overflow, GitHub (yacy/yacy_search_server), Medium, Meta Stack Exchange и Knowledge Base на дату .