regexp

Поиск документов, содержащих термины, соответствующие регулярному выражению

Запрос regexp (поиск по регулярным выражениям)

Назначение

Запрос regexp позволяет выполнять поиск терминов, соответствующих указанному регулярному выражению. Подробнее о синтаксисе регулярных выражений см. в документации по синтаксису регулярных выражений.

Базовый пример

GET shakespeare/_search
{
  "query": {
    "regexp": {
      "play_name": "[a-zA-Z]amlet"
    }
  }
}

Этот запрос ищет любые термины в поле play_name, которые начинаются с любой буквы (верхнего или нижнего регистра), за которой следует “amlet”.

Ключевые особенности

  1. Область применения:
    Регулярные выражения применяются к отдельным терминам (токенам) в поле, а не ко всему полю целиком.

  2. Ограничения:

    • Максимальная длина регулярного выражения по умолчанию: 1,000 символов (настраивается через index.max_regex_length)
    • Используется синтаксис Lucene, который отличается от стандартных реализаций
  3. Производительность:

    • Избегайте шаблонов с .* или .*?+ без префикса/суффикса
    • Ресурсоемкие операции, требуют search.allow_expensive_queries=true
    • Для частых запросов рекомендуется тестировать влияние на кластер
  4. Оптимизация:
    Тип поля wildcard специально оптимизирован для эффективных запросов с регулярными выражениями.

Расширенный синтаксис с параметрами

GET _search
{
  "query": {
    "regexp": {
      "<поле>": {
        "value": "[Ss]ample",
        "boost": 1.5,
        "case_insensitive": true,
        "flags": "INTERSECTION|COMPLEMENT",
        "max_determinized_states": 20000,
        "rewrite": "constant_score"
      }
    }
  }
}

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

Параметр Тип данных Описание По умолчанию
value Строка Обязательный. Регулярное выражение для поиска -
boost Число с плавающей точкой Коэффициент релевантности (>1 - увеличивает, 0-1 - уменьшает) 1.0
case_insensitive Логический Регистронезависимый поиск false
flags Строка Дополнительные операторы Lucene (INTERSECTION, COMPLEMENT и др.) -
max_determinized_states Целое число Максимальное число состояний автомата (защита от перегрузки) 10000
rewrite Строка Метод перезаписи запроса (constant_score, scoring_boolean и др.) constant_score

Рекомендации по использованию

  1. Тестирование:
    Всегда проверяйте регулярные выражения на тестовых данных перед использованием в production.

  2. Производительность:

    // Неэффективно:
    { "regexp": { "text": ".*pattern.*" } }
    
    // Оптимально:
    { "regexp": { "text": "prefix.*suffix" } }
    
  3. Альтернативы:
    Для сложных сценариев рассмотрите:

    • Использование wildcard типа поля
    • Применение match_phrase для текстовых фраз
    • Использование keyword полей для точного соответствия
  4. Безопасность:
    Ограничивайте max_determinized_states для предотвращения DoS-атак через сложные регулярные выражения.

Примечание: При search.allow_expensive_queries=false запросы regexp не выполняются.