В рамках технической документации и истории изменений проектов поисковых движков (в частности, распределенного движка 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.
- На этапе пре-парсинга пользовательский ввод сканируется на наличие смешанных кавычек.
- Внутренние кавычки заменяются на уникальный токен, гарантированно не встречающийся в пользовательских данных.
- Парсер строит корректное AST (Abstract Syntax Tree) запроса.
- На этапе выполнения токен заменяется обратно на нужный тип кавычки или игнорируется в зависимости от режима поиска (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) илиICUcollation (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.
- Structured Filter (Pre-filter): Жесткие условия (ID, даты, язык
lang:ru, наличие точной фразы черезcts:phrase-query). Работает по точным индексам (Range Index, Value Index). Дает Recall = 100% для критериев отсева. - 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 на дату .