Дата подготовки материала: 02:23:36 ().
В современных системах полнотекстового поиска часто возникает необходимость найти точное сочетание слов, включая знаки препинания, пробелы или специальные символы. Обычные поисковые движки нормализуют введённый текст – удаляют пунктуацию, приводят к одному регистру, разбивают на токены. Это ускоряет поиск, но делает невозможным поиск по «буквальному» (quoted) запросу.
В данной статье (часть 1015 серии материалов о поисковых технологиях) мы рассмотрим, как обеспечить поддержку буквальных запросов, какие подходы используются в популярных СУБД и поисковых движках, а также дадим практические рекомендации по настройке и использованию таких запросов.
Что такое буквальный поисковый запрос?
Буквальный (или цитированный) запрос – это строка, заключённая в кавычки (обычно двойные «»…»» или одинарные «’…’»), которая передаётся поисковому движку без предварительной нормализации. Движок должен искать документы, содержащие точно эту последовательность символов, включая пробелы, знаки препинания и специальные символы.
- Пример:
"hello, world!"должен находить только записи, где встречается именно фраза hello, world! с запятой и восклицательным знаком. - Без кавычек тот же запрос будет разбит на токены
helloиworld, и пунктуация будет проигнорирована.
Почему важно сохранять пунктуацию и спецсимволы?
В wielu областях – от юридического поиска до работы с идентификаторами (UUID, SKU, коды продуктов) – точное соответствие строки критично. Игнорирование пунктуации может привести к ложным срабатываниям или пропуску нужных записей.
Примеры из практики
- Юридические документы: поиск по точной фразе «§ 123 Abs. 4» требует сохранения знака параграфа и пробела.
- Идентификаторы: UUID вида
c9459fef-e...содержит дефисы; без них поиск вернёт несоответствующие записи. - Программный код: поиск по фразе
function foo {должен учитывать скобки и пробелы.
Реализация буквального поиска в различных СУБД и поисковых движках
MySQL
В MySQL полнотекстовый индекс по умолчанию удаляет пунктуацию. Чтобы искать буквально, можно:
- Использовать оператор
LIKEс экранированием специальных символов:
SELECT * FROM articles WHERE body LIKE '%"hello, world!"%';
REPLACE для удаления или замены нежелательных символов перед сравнением:SELECT * FROM articles WHERE REPLACE(REPLACE(body, '.', ''), ',', '') LIKE '%hello world%';
magic_function(column_name), которая сохраняет оригинальную строку и использует её в условии LIKE.PostgreSQL
PostgreSQL предлагает более гибкие возможности через текстовый поиск с пользовательскими словарями и оператор ~ (регулярные выражения):
- Для точного совпадения с учётом регистра можно использовать
ILIKEвместе с экранированием:
SELECT FROM docs WHERE content ILIKE '%"hello, world!"%';
SELECT * FROM docs WHERE content ~* '"hello, world!"';
simple словаря).Redis (RediSearch)
RediSearch по умолчанию использует анализатор, который разбивает текст на токены, удаляя пунктуацию. Чтобы искать буквально:
- При индексации указать анализатор
exact(илиverbatimв новых версиях), который сохраняет исходную строку без изменений:
FT.CREATE idx SCHEMA field TEXT SORTABLE NOSTEM NOCASE
"" (двойные кавычки) – RediSearch будет искать точное совпадение:FT.SEARCH idx '"hello, world!"'
Azure AI Search
В Azure AI Search рекомендуется использовать анализатор, сохраняющий исходную строку во время индексирования:
- Определить пользовательский анализатор
whitespaceилиkeyword (который не разбивает текст на токены):
{
"name": "my_exact_analyzer",
"tokenizer": "keyword",
"filters": ["lowercase"]
}
search=""hello, world!""
Лучшие практики при работе с буквальными запросами
- Выбирать правильный анализатор/токенизатор на этапе индексирования. Если нужен точный поиск – используйте
keywordили аналог, который не разбивает строку. - Экранировать специальные символы в пользовательском вводе, чтобы избежать инъекций или ошибочного интерпретирования операторов поиска.
- Тестировать на репрезентативных наборах данных, включающих различные варианты пунктуации, unicode‑символы и пробелы.
- Документировать ограничения вашего поискового движка (например, максимальную длину токена, поддержку кавычек внутри строки).
- Кешировать часто используемые буквальные запросы, если они требуют тяжелых операций
LIKEили регулярных выражений.
Поддержка буквальных (цитированных) поисковых запросов – важная часть любой современной системы поиска, особенно когда требуется точное соответствие строк, содержащих пунктуацию, специальные символы или зарезервированные слова. Выбор правильного анализатора на этапе индексирования, использование операторов LIKE/регулярных выражений или специализированных полнотекстовых движков (RediSearch, Azure AI Search) позволяет достичь нужного уровня точности без существенной потери производительности.
В рамках серии статей «Часть 1015» мы рассмотрели теоретические основы, практические примеры в MySQL, PostgreSQL, Redis и Azure AI Search, а также дали рекомендации по внедрению буквального поиска в ваши проекты. Надеемся, эта информация поможет вам построить более надёжный и точный поисковый опыт для ваших пользователей.
Автор: ваш помощник по поисковым технологиям. Дата: 02:23:36.