В сфере эзотерических услуг, где терминология часто бывает уникальной, а запросы пользователей — высокоспециализированными, обычный полнотекстовый поиск (full-text search) часто выдает слишком много шума. Пользователь, ищущий «расклад на картах Таро Манары» или «коррекция кармы по методу Сат Нам Расаян», не хочет видеть в выдаче статьи про «карты памяти» или «коррекцию осанки». Именно здесь на первый план выходит жесткий поиск по фразе (exact phrase matching).
Что такое жесткий поиск по фразе?
Жесткий поиск по фразе — это режим информационного поиска, при котором система ищет документы, содержащие все слова запроса в точном порядке, в котором они были введены, без стемминга (приведения к корню), лемматизации, учета синонимов или перестановки слов.
- Мягкий поиск (стандартный): запрос «магические ритуалы» найдет «ритуалы магические», «магия ритуалов», «магический ритуал».
- Жесткий поиск (Exact Match): запрос
"магические ритуалы"(в кавычках) найдет только то, где эти два слова стоят рядом именно в таком порядке и в этой форме.
Для ниши эзотерики это критически важно, так как названия практик, авторские методики и имена сущностей часто состоят из слов, имеющих совершенно другое значение в бытовом контексте (например: «Заземление» — в электрике и в энергетике; «Чакра» — в йоге и в сленге; «Пендул» — в физике и в даузинге).
Основные методы реализации точного совпадения
N-граммная индексация (Shingling / N-grams)
Один из самых быстрых методов для точного поиска фраз, разбиение текста и запроса на последовательные цепочки длины N (обычно символов или слов).
- Word-level N-grams: Фраза «астральный проекция» разбивается на биграммы:
[«астральный проекция»]; Индекс хранит хеши этих биграмм. При поиске вычисляется хеш запроса и ищется точное совпадение в инвертированном индексе. - Character-level N-grams (Trigrams): Эффективно для устойчивости к опечаткам внутри фразы, но требует пост-фильтрации для гарантии точности границ слов.
Применение в эзотерике: Идеально для поиска устойчивых названий курсов («Школа Транссерфинга Реальности»), книг («Книга Мертвых Тибетская») или имен практиков.
Позиционные инвертированные индексы (Positional Inverted Index)
Классический подход поисковых движков (Elasticsearch, OpenSearch, Solr, Sphinx, Meilisearch). В индексе для каждого термина хранится не только ID документа, но и позиция (offset) слова в документе.
Термин: "астральный" -> { DocID: 1, Positions: [5, 42, 101] }
Термин: "проекция" -> { DocID: 1, Positions: [6, 43, 102] }
При выполнении фразового запроса "астральный проекция" движок выполняет пересечение списков документов (Intersection) и проверяет условие: Pos(проекция) == Pos(астральный) + 1.
Настройка для эзотерики: Важно отключить или ограничить Analyzer (анализатор) для полей, где требуется жесткий поиск. Используйте keyword тип поля или кастомный анализатор с токенизатором whitespace и фильтром lowercase (без стеммера/лемматизатора).
Phrase Queries в современных движках (Elasticsearch / OpenSearch DSL)
На практике разработчики используют встроенные типы запросов.
match_phrase
Стандартный запрос для точного совпадения фразы. Анализирует строку запроса тем же анализатором, что и поле индекса, и строит Span-запрос с условием смещения slop=0.
GET /esoteric_services/_search
{
"query": {
"match_phrase": {
"service_name": {
"query": "регрессивная гипноз прошлые жизни",
"slop": 0
}
}
}
}
match_phrase_prefix
Позволяет автодополнение последнего слова фразы. Полезно в поисковой строке (Search-as-you-type).
GET /esoteric_services/_search
{
"query": {
"match_phrase_prefix": {
"practitioner_bio": "таро мастер мос"
}
}
}
Найдет «таро мастер москва», «таро мастер москве» и т.д., сохраняя жесткий порядок предыдущих слов.
intervals query (Продвинутый контроль)
Появился в Elasticsearch 7.x. Дает гранулярный контроль над порядком, расстоянием и вложенностью. Позволяет искать «фразу А рядом с фразой Б, но не дальше ».
GET /esoteric_services/_search
{
"query": {
"intervals": {
"description": {
"all_of": {
"ordered": true,
"intervals": [
{ "match": { "query": "чистка ауры", "max_gaps": 0 } },
{ "match": { "query": "пендулем", "max_gaps": 2 } }
]
}
}
}
}
}
Использование Keyword-полей и Normalizer’ов
Для фильтров, фасетов и агрегаций (например, «Выбрать услугу: Нумерология», «Тип консультации: Синдастрия») текстовые поля (text) не подходят, так как они токенизируются. Необходимо использовать поля типа keyword с normalizer.
PUT /esoteric_services
{
"settings": {
"analysis": {
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"filter": ["lowercase", "asciifolding"]
} }
}
},
"mappings": {
"properties": {
"service_category": { "type": "keyword", "normalizer": "lowercase_normalizer" },
"method_name": { "type": "keyword" }
}
}
}
Теперь термовый запрос (term query) по полю method_name будет искать точное значение (с учетом нормализации регистра), что идеально подходит для каталогов услуг.
Специфика эзотерической ниши: проблемы и решения
Проблема 1: Синонимия и вариативность написания
Пользователи пишут: «таро», «таро карты», «карты таро», «ТАРО», «Tarot». Жесткий поиск по фразе «расклад таро» не найдет «расклад на таро».
Решение: Гибридный подход (Multi-field mapping).
- Поле
title.standard(text analyzer с синонимами и стеммингом) — для релевантного/нечеткого поиска. - Поле
title.exact(keyword или text с whitespace analyzer) — для жесткого поиска и буста точных совпадений. - Поле
title.suggest(completion suggester) — для автодополнения.
При ранжировании (scoring) дайте максимальный вес (boost) попаданию в title.exact.
Проблема 2: Морфология русского языка (Склонения/Спряжения)
Запрос: «мастер реики». В тексте: «мастера реики», «мастеру реики», «о мастере реики». Жесткий поиск по словам (word-level) провалится.
Решение:
- Лемматизация на индексации и поиске: Использовать морфологический анализатор (Russian Morphology / Mystem / pymorphy2) для приведения к начальной форме. Тогда «мастер реики» и «мастера реики» превратятся в одинаковые токены.
- Slop (пробел) в match_phrase: Установить
slop: 1-2. Это позволяет пропускать служебные частицы/предлоги или менять порядок слов в небольшом окне, сохраняя семантику фразы. - Shingles на леммах: Строить N-граммы не из словформы, а из лемм.
Проблема 3: Именованные сущности (NER) и авторские методы
В эзотерике много уникальных брендов: «Метод Силы Намерения», «Тантра Йога Кашмира», «Астропрогноз по Методу Фирдарии».
Решение: Предварительная извлекация сущностей (NER) на этапе индексации (с помощью spaCy, Natasha, BERT-NER) и запись их в отдельное поле entities.method_name (type: keyword). Поиск по этому полю будет идеально точным.
Архитектура поискового бэкенда для каталога эзотерических услуг
- Индексация (Ingestion Pipeline):
- Прохождение через NER-модель для выделения: Имя практика, Название методики, Инструменты (руны, таро, маятник), Проблема клиента (деньги, отношения, здоровье).
- Запись в Elasticsearch/Opensearch с маппингом multi-fields.
- Поисковый запрос (Search Time):
- Парсинг запроса пользователя: выделение кавычек
"..."(явный жесткий поиск). - Построение
boolзапроса:- must:
match_phraseпо полямtitle.exact,method_name(boost=10). - should:
matchпо полямtitle.standard,description.standard(boost=1). - filter: Термы по категориям, городу, формату (онлайн/офлайн), ценовому диапазону.
- must:
- Реренкинг (Learning to Rank) с учетом CTR, рейтинга практика, точности совпадения фразы.
- Парсинг запроса пользователя: выделение кавычек
- Автодополнение (Suggest): Completion Suggester на основе популярных точных фраз из логов поиска («расклад на отношения таро», «нумерология дата рождения совместимость»).
Пример оптимального запроса (Elasticsearch DSL)
GET /services/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"title.exact": {
"query": "кармический расклад таро",
"boost": 20,
"slop": 0
}
}
},
{
"match_phrase": {
"methods.keyword": {
"query": "кармический расклад таро",
"boost": 15
}
}
},
{
"multi_match": {
"query": "кармический расклад таро",
"type": "best_fields",
"fields": ["title.standard^5", "description.standard", "practitioner_name^3"],
"fuzziness": "AUTO",
"operator": "and"
} }
],
"filter": [
{ "term": { "is_active": true } },
{ "term": { "format": "online" } }
],
"minimum_should_match": 1
}
},
"highlight": {
"fields": {
"description.standard": { "fragment_size": 150, "number_of_fragments": 1 }
} },
"size": 20
}
Клиентская сторона: UX для жесткого поиска
Техническая реализация бессмысленна без правильного интерфейса.
- Явные кавычки: Обучайте пользователей (подсказкой плейсхолдера) использовать кавычки для точного поиска:
"регрессия в прошлые жизни". - Фасетная навигация: После ввода запроса показывайте чекбоксы: «Метод: Транссерфинг (5)», «Инструмент: Пендул (12)». Это позволяет сузить выбор без сложных запросов.
- Коррекция опечаток (Did you mean?): Если жесткий поиск по фразе в кавычках ничего не дал — автоматически запускайте мягкий поиск и показывайте баннер: «Ничего не найдено для «кармическй расклад». Показаны результаты для «кармический расклад»».
- Поиск по сущностям: Если система распознала в запросе имя практика или название уникальной методики — сразу предлагайте переход на профиль/страницу метода (Entity-based search).
Жесткий поиск по фразе — это не просто техническая настройка slop=0, а комплексная стратегия, включающая:
- Мульти-поля (multi-fields) для разделения логики точного совпадения и нечеткого поиска.
- Лингвистическую нормализацию (лемматизацию) для победы над русской морфологией без потери точности;
- Извлечение именованных сущностей (NER) для каталогизации авторских методик и имен практиков.
- Гибридное ранжирование, где точное попадание фразы дает максимальный буст релевантности.
В нише эзотерических услуг, где доверие клиента строится на точном совпадении запроса («именно этот мастер, именно этот метод») с предложением, внедрение описанных методов напрямую увеличивает конверсию поиска в запись на консультацию и снижает процент отказов (bounce rate) от нерелевантной выдачи.