Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL

Синтаксис регулярных выражений

Регулярное выражение — это способ сопоставления шаблонов в данных с помощью символов-заменителей, называемых операторами.

Elasticsearch поддерживает регулярные выражения в следующих запросах:

  • regexp
  • query_string

Elasticsearch использует движок регулярных выражений Apache Lucene для обработки этих запросов.

Зарезервированные символы

Движок регулярных выражений Lucene поддерживает все символы Unicode. Однако следующие символы зарезервированы как операторы:

. ? + * | { } [ ] ( ) " \

В зависимости от включённых дополнительных операторов, следующие символы также могут быть зарезервированы:

# @ & < >  ~

Чтобы использовать один из этих символов буквально, экранируйте его предшествующей обратной косой чертой или заключите в двойные кавычки. Например:

\@                  # renders as a literal '@'
\\                  # renders as a literal '\'
"john@smith.com"    # renders as 'john@smith.com'

Обратная косая черта является символом экранирования как в строках JSON, так и в регулярных выражениях. Вам необходимо экранировать обе обратные косые черты в запросе, если вы не используете клиентский язык, который позаботится об этом. Например, строка a\b должна быть проиндексирована как "a\\b":

resp = client.index(
    index="my-index-000001",
    id="1",
    document={
        "my_field": "a\\b"
    },
)
print(resp)
response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    my_field: 'a\\b'
  }
)
puts response
const response = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    my_field: "a\\b",
  },
});
console.log(response);
PUT my-index-000001/_doc/1
{
  "my_field": "a\\b"
}

Этот документ соответствует следующему regexp запросу:

resp = client.search(
    index="my-index-000001",
    query={
        "regexp": {
            "my_field.keyword": "a\\\\.*"
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      regexp: {
        'my_field.keyword' => 'a\\\\.*'
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  query: {
    regexp: {
      "my_field.keyword": "a\\\\.*",
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "regexp": {
      "my_field.keyword": "a\\\\.*"
    }
  }
}

Стандартные операторы

Движок регулярных выражений Lucene не использует библиотеку Perl Compatible Regular Expressions (PCRE), но поддерживает следующие стандартные операторы.

.

Сопоставляет любой символ. Например:

ab.     # matches 'aba', 'abb', 'abz', etc.
?

Повторяет предыдущий символ ноль или один раз. Часто используется для того, чтобы сделать предыдущий символ необязательным. Например:

abc?     # matches 'ab' and 'abc'
+

Повторяет предыдущий символ один или более раз. Например:

ab+     # matches 'ab', 'abb', 'abbb', etc.
*

Повторяет предыдущий символ ноль или более раз. Например:

ab*     # matches 'a', 'ab', 'abb', 'abbb', etc.
{}

Минимальное и максимальное количество повторений предыдущего символа. Например:

a{2}    # matches 'aa'
a{2,4}  # matches 'aa', 'aaa', and 'aaaa'
a{2,}   # matches 'a` repeated two or more times
|

Оператор ИЛИ. Сопоставление будет успешным, если совпадёт самый длинный шаблон либо слева, либо справа. Например:

abc|xyz  # matches 'abc' and 'xyz'
( … )

Образует группу. Вы можете использовать группу для обработки части выражения как единого символа. Например:

abc(def)?  # matches 'abc' and 'abcdef' but not 'abcd'
[ … ]

Сопоставление с одним из символов в скобках. Например:

[abc]   # matches 'a', 'b', 'c'

Внутри скобок, - указывает диапазон, если - не является первым символом или не экранирован. Например:

[a-c]   # matches 'a', 'b', or 'c'
[-abc]  # '-' is first character. Matches '-', 'a', 'b', or 'c'
[abc\-] # Escapes '-'. Matches 'a', 'b', 'c', or '-'

Символ ^ перед символом в скобках отрицает символ или диапазон. Например:

[^abc]      # matches any character except 'a', 'b', or 'c'
[^a-c]      # matches any character except 'a', 'b', or 'c'
[^-abc]     # matches any character except '-', 'a', 'b', or 'c'
[^abc\-]    # matches any character except 'a', 'b', 'c', or '-'

Дополнительные операторы

Вы можете использовать параметр flags, чтобы включить дополнительные операторы для движка регулярных выражений Lucene.

Для включения нескольких операторов используйте разделитель |. Например, значение flags, равное COMPLEMENT|INTERVAL, включает операторы COMPLEMENT и INTERVAL.

Допустимые значения

ALL (По умолчанию)
Включает все дополнительные операторы.
"" (пустая строка)
Псевдоним для значения ALL.
COMPLEMENT

Включает оператор ~. Вы можете использовать ~ для отрицания самого короткого следующего шаблона. Например:

a~bc   # matches 'adc' and 'aec' but not 'abc'
EMPTY

Включает оператор # (пустой язык). Оператор # не сопоставляет ни одну строку, даже пустую.

Если вы создаёте регулярные выражения путём программирования, комбинируя значения, вы можете передать # для указания "нет строки". Это позволит избежать случайного сопоставления пустых строк или других нежелательных строк. Например:

#|abc  # matches 'abc' but nothing else, not even an empty string
INTERVAL

Включает операторы <>. Вы можете использовать <> для сопоставления числового диапазона. Например:

foo<1-100>      # matches 'foo1', 'foo2' ... 'foo99', 'foo100'
foo<01-100>     # matches 'foo01', 'foo02' ... 'foo99', 'foo100'
INTERSECTION

Включает оператор &, который действует как оператор И. Сопоставление будет успешным, если шаблоны слева и справа совпадают. Например:

aaa.+&.+bbb  # matches 'aaabbb'
ANYSTRING

Включает оператор @. Вы можете использовать @ для сопоставления любой всей строки.

Вы можете объединить оператор @ с операторами & и ~ для создания логики "все, кроме". Например:

@&~(abc.+)  # matches everything except terms beginning with 'abc'
NONE
Отключает все дополнительные операторы.

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

Движок регулярных выражений Lucene не поддерживает операторы якорей, такие как ^ (начало строки) или $ (конец строки). Для сопоставления термина регулярное выражение должно сопоставлять всю строку.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/regexp-syntax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API