wildcard

Поиск документов, содержащих термины, соответствующие шаблону с подстановочными символами

Wildcard Query (Поиск с подстановочными символами)

Основное назначение

Запрос wildcard позволяет выполнять поиск терминов по шаблону с использованием подстановочных символов. Особенно полезен для:

  • Поиска по частичным совпадениям
  • Нечеткого поиска с известной структурой
  • Работы с кодами, артикулами и другими структурированными данными

Поддерживаемые операторы

Оператор Описание Пример
* Соответствует нулю или более символов H*Y найдет “HAPPY”, “HALLEY”
? Соответствует любому одному символу H?Y найдет “HAY”, но не “HAPPY”
case_insensitive Флаг регистронезависимости true/false (по умолчанию false)

Примеры запросов

1. Чувствительный к регистру поиск:

GET shakespeare/_search
{
  "query": {
    "wildcard": {
      "speaker": {
        "value": "H*Y",
        "case_insensitive": false
      }
    }
  }
}

2. Использование разных операторов:

  • H*Y - найдет любые значения, начинающиеся на H и заканчивающиеся на Y
  • H?Y - найдет только 3-символьные значения типа “HMY”

Параметры запроса

Базовый синтаксис:

GET _search
{
  "query": {
    "wildcard": {
      "<поле>": {
        "value": "шаб*лон",
        ...
      }
    }
  }
}
Параметр Тип данных Описание По умолчанию
value String Шаблон для поиска с подстановочными символами Обязательный
boost Float Коэффициент релевантности (>1 - увеличивает, 0-1 - уменьшает) 1.0
case_insensitive Boolean Регистронезависимый поиск false
rewrite String Метод перезаписи запроса (constant_score, scoring_boolean и др.) constant_score

Критические особенности производительности

  1. Предупреждение:
    Wildcard-запросы могут быть медленными, так как требуют перебора множества терминов.

  2. Золотое правило:
    Избегайте размещения подстановочных символов в начале шаблона (например, *pattern), так как это:

    • Крайне ресурсоемко
    • Может привести к таймаутам
    • Создает нагрузку на кластер
  3. Оптимизация:
    Для частых wildcard-запросов используйте специальный wildcard тип поля, который:

    • Создает оптимизированный индекс
    • Обеспечивает высокую производительность
    • Поддерживает сложные шаблоны

Практические рекомендации

  1. Для префиксного поиска используйте prefix запрос вместо H*:

    {
      "query": {
        "prefix": {
          "field": "H"
        }
      }
    }
    
  2. Для сложных шаблонов рассмотрите:

    • Использование wildcard типа поля
    • Применение regexp запросов для более сложных паттернов
  3. При работе с большими индексами:

    • Ограничивайте время выполнения через timeout
    • Используйте search.allow_expensive_queries для контроля
  4. Пример безопасного шаблона:

    {
      "query": {
        "wildcard": {
          "product_code": {
            "value": "ABC-202?-*",
            "case_insensitive": true
          }
        }
      }
    }
    

    Такой шаблон найдет коды типа “ABC-2023-XXX” и безопасен для выполнения.

Важные ограничения

  1. При search.allow_expensive_queries=false wildcard-запросы не выполняются
  2. Максимальная длина шаблона ограничена параметром index.max_regex_length (по умолчанию 1000 символов)
  3. Не поддерживает стандартные regex-конструкции (используйте regexp запрос для сложных выражений)