regexp
Запрос regexp (поиск по регулярным выражениям)
Назначение
Запрос regexp
позволяет выполнять поиск терминов, соответствующих указанному регулярному выражению. Подробнее о синтаксисе регулярных выражений см. в документации по синтаксису регулярных выражений.
Базовый пример
GET shakespeare/_search
{
"query": {
"regexp": {
"play_name": "[a-zA-Z]amlet"
}
}
}
Этот запрос ищет любые термины в поле play_name
, которые начинаются с любой буквы (верхнего или нижнего регистра), за которой следует “amlet”.
Ключевые особенности
-
Область применения:
Регулярные выражения применяются к отдельным терминам (токенам) в поле, а не ко всему полю целиком. -
Ограничения:
- Максимальная длина регулярного выражения по умолчанию: 1,000 символов (настраивается через
index.max_regex_length
) - Используется синтаксис Lucene, который отличается от стандартных реализаций
- Максимальная длина регулярного выражения по умолчанию: 1,000 символов (настраивается через
-
Производительность:
- Избегайте шаблонов с
.*
или.*?+
без префикса/суффикса - Ресурсоемкие операции, требуют
search.allow_expensive_queries=true
- Для частых запросов рекомендуется тестировать влияние на кластер
- Избегайте шаблонов с
-
Оптимизация:
Тип поля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 |
Рекомендации по использованию
-
Тестирование:
Всегда проверяйте регулярные выражения на тестовых данных перед использованием в production. -
Производительность:
// Неэффективно: { "regexp": { "text": ".*pattern.*" } } // Оптимально: { "regexp": { "text": "prefix.*suffix" } }
-
Альтернативы:
Для сложных сценариев рассмотрите:- Использование
wildcard
типа поля - Применение
match_phrase
для текстовых фраз - Использование
keyword
полей для точного соответствия
- Использование
-
Безопасность:
Ограничивайтеmax_determinized_states
для предотвращения DoS-атак через сложные регулярные выражения.
Примечание: При search.allow_expensive_queries=false
запросы regexp
не выполняются.