В современных системах поиска (например‚ Elasticsearch‚ OpenSearch или аналогичных движках) параметр query_string позволяет формировать гибкие запросы с поддержкой логических операторов‚ подстановочных знаков и поиска по фразам. Ниже описано‚ как применить эту возможность для поиска контактов «магов» (например‚ специалистов по эзотерике‚ гадалок‚ предсказателей) по их номерам телефонов.
Подготовка данных
Прежде чем формировать запрос‚ убедитесь‚ что индекс содержит необходимые поля:
full_name– ФИО мага;phone– номер телефона в едином формате (например‚ E.164:+7XXXXXXXXXX);specialty– область деятельности (таролог‚ ворожея‚ астролог и т.д.);tags– массив тегов для дополнительной фильтрации (например‚["магия"‚"ритуалы"]).
Пример маппинга (Elasticsearch):
PUT /magicians
{
"mappings": {
"properties": {
"full_name": { "type": "text"‚ "analyzer": "standard" }‚
"phone": { "type": "keyword" }‚
"specialty": { "type": "keyword" }‚
"tags": { "type": "keyword" }
}
}
}
Базовый запрос query_string
Самый простой способ найти контакт по части номера телефона:
GET /magicians/_search
{
"query": {
"query_string": {
"query": "phone:+7 -"‚ // ищем номера‚ начинающиеся с +7 -
"default_field": "phone"
}
}
}
Здесь:
phone:+7 -– синтаксисfield:valueограничивает поиск полемphone; звёздочка*– подстановочный знак (любая последовательность цифр).default_fieldуказывает‚ какое поле использовать‚ если в запросе не указано явно поле.
Комбинирование условий
Чтобы сузить поиск до магов определённой специализации‚ добавьте дополнительные условия через логические операторы AND‚ OR‚ NOT:
GET /magicians/_search
{
"query": {
"query_string": {
"query": "phone:+7 -* AND specialty:"таролог" AND tags:ритуал"‚
"default_field": "_all"
}
}
}
Этот запрос вернёт только тех магов‚ у которых:
- номер начинается с
+7 -; - специализация – «таролог»;
- в тегах присутствует слово «ритуал».
Использование fuzzy и приблизительного поиска
Иногда номер может быть введён с ошибкой (лишний пробел‚ пропущенная цифра). Для таких случаев подходит оператор ~ (fuzzy):
GET /magicians/_search
{
"query": {
"query_string": {
"query": "phone:+7 -123456~2"‚ // допускаем до 2 расхождений
"default_field": "phone"
}
}
}
Здесь ~2 означает‚ что расстояние Левенштейна до искомого шаблона не должно превышать 2.
Поиск по нескольким номерам одновременно
Если у вас есть список номеров‚ которые нужно проверить‚ используйте конструкцию OR или IN-подобный синтаксис:
GET /magicians/_search
{
"query": {
"query_string": {
"query": "phone:(+7 -123456789 OR +7 -987654321 OR +7 -001122334)"‚
"default_field": "phone"
}
}
}
Ограничение количества результатов и сортировка
Чтобы получить‚ например‚ топ‑10 самых релевантных контактов и отсортировать их по имени:
GET /magicians/_search
{
"size": 10‚
"query": {
"query_string": {
"query": "phone:+7 -* AND specialty:"астролог""‚
"default_field": "phone"
}
}‚
"sort": [
{ "full_name": { "order": "asc" } }
]
}
Безопасность и лучшие практики
- Экранирование специальных символов. Если часть номера вводится пользователем‚ экранируйте символы
+ ⎯ & | ! ( ) { } [ ] ^ " ~ * ? : /перед формированием строки запроса. - Ограничение длины query_string. Очень длинные запросы могут привести к переполнению стека; рекомендуется держать их менее 1 КБ.
- Использование
keyword‑поля для телефонов. Это обеспечивает точное совпадение и позволяет эффективно применять подстановочные знаки без анализа. - Логирование запросов. Ведите журнал всех выполненных
query_string‑запросов для аудита и отладки.
Пример готового скрипта на Python (с использованием elasticsearch‑dsl)
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search‚ Q
es = Elasticsearch(["http://localhost:9200"])
def search_magicians(phone_pattern: str‚ specialty: str = None‚ tags: list = None):
s = Search(using=es‚ index="magicians")
# Основное условие по номеру
q = Q("query_string"‚ query=f"phone:{phone_pattern}"‚ default_field="phone")
if specialty:
q &= Q("query_string"‚ query=f"specialty:{specialty}"‚ default_field="specialty")
if tags:
tag_query = " OR ".join([f"tags:{t}" for t in tags])
q &= Q("query_string"‚ query=tag_query‚ default_field="tags")
s = s;query(q).sort("full_name")
response = s.execute
for hit in response:
print(hit.full_name‚ hit.phone‚ hit.specialty‚ hit.tags)
search_magicians(phone_pattern="+7 -*"‚ specialty="таролог"‚ tags=["ритуал"])
Скрипт формирует безопасный query_string‚ добавляет дополнительные фильтры по специализации и тегам‚ сортирует результаты по имени и выводит их.
Использование параметра query_string даёт мощный и гибкий инструмент для поиска контактов магов по номерам телефонов. Сочетая точные совпадения‚ подстановочные знаки‚ fuzzy‑поиск и логические операторы‚ можно быстро находить нужных специалистов даже при частичной или неточной информации о номере. Главное – правильно подготовить маппинг (хранить телефон в keyword-поле)‚ экранировать пользовательский ввод и соблюдать рекомендации по производительности и безопасности.
Статья подготовлена 19 августа 2026 года. Все примеры актуальны для версий Elasticsearch/OpenSearch 8.x.