正規表現の構文
正規表現(regular expression)は、プレースホルダー文字(オペレーターと呼ばれる)を使用してデータ内のパターンを一致させる方法です。
Elasticsearchは、以下のクエリで正規表現をサポートしています:
Elasticsearchは、Apache Luceneの正規表現エンジンを使用してこれらのクエリを解析します。
予約文字
Luceneの正規表現エンジンは、すべてのUnicode文字をサポートしています。ただし、以下の文字はオペレーターとして予約されています:
. ? + * | { } [ ] ( ) " \
有効にされているオプションのオペレーターに応じて、以下の文字も予約される場合があります:
# @
&
<
> ~
これらの文字のいずれかをリテラルとして使用するには、前にバックスラッシュを付けるか、二重引用符で囲みます。例えば:
\@ # renders as a literal '@'
\\ # renders as a literal '\'
"[email protected]" # renders as '[email protected]'
バックスラッシュは、JSON文字列と正規表現の両方でエスケープ文字です。クエリ内のバックスラッシュは両方エスケープする必要がありますが、言語クライアントを使用する場合はこれを処理します。例えば、文字列a\b
は"a\\b"
としてインデックス化する必要があります:
Python
resp = client.index(
index="my-index-000001",
id="1",
document={
"my_field": "a\\b"
},
)
print(resp)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
my_field: 'a\\b'
}
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
document: {
my_field: "a\\b",
},
});
console.log(response);
Console
PUT my-index-000001/_doc/1
{
"my_field": "a\\b"
}
このドキュメントは、以下のregexp
クエリに一致します:
Python
resp = client.search(
index="my-index-000001",
query={
"regexp": {
"my_field.keyword": "a\\\\.*"
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my-index-000001',
body: {
query: {
regexp: {
'my_field.keyword' => 'a\\\\.*'
}
}
}
)
puts response
Js
const response = await client.search({
index: "my-index-000001",
query: {
regexp: {
"my_field.keyword": "a\\\\.*",
},
},
});
console.log(response);
Console
GET my-index-000001/_search
{
"query": {
"regexp": {
"my_field.keyword": "a\\\\.*"
}
}
}
標準オペレーター
Luceneの正規表現エンジンは、Perl Compatible Regular Expressions (PCRE)ライブラリを使用していませんが、以下の標準オペレーターをサポートしています。
.
- 任意の文字に一致します。例えば:
ab. # matches 'aba', 'abb', 'abz', etc.
?
- 前の文字を0回または1回繰り返します。前の文字をオプションにするためによく使用されます。例えば:
abc? # matches 'ab' and 'abc'
+
- 前の文字を1回以上繰り返します。例えば:
ab+ # matches 'ab', 'abb', 'abbb', etc.
*
- 前の文字を0回以上繰り返します。例えば:
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
|
- ORオペレーター。左側または右側のいずれかの最長パターンが一致すれば、マッチは成功します。例えば:
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 '-'
オプションのオペレーター
Luceneの正規表現エンジンに対して、flags
パラメータを使用して、より多くのオプションのオペレーターを有効にできます。
複数のオペレーターを有効にするには、|
区切りを使用します。例えば、flags
の値がCOMPLEMENT|INTERVAL
の場合、COMPLEMENT
およびINTERVAL
オペレーターが有効になります。
有効な値
ALL
(デフォルト)- すべてのオプションのオペレーターを有効にします。
""
(空文字列)ALL
の値のエイリアス。COMPLEMENT
``````bash
a~bc # matches 'adc' and 'aec' but not 'abc'
`
EMPTY
プログラムで値を組み合わせて正規表現を作成する場合、`````#`````を渡して「文字列なし」を指定できます。これにより、空の文字列や他の不要な文字列と誤って一致するのを避けることができます。例えば:
``````bash
#|abc # matches 'abc' but nothing else, not even an empty string
`
INTERVAL
``````bash
foo<1-100> # matches 'foo1', 'foo2' ... 'foo99', 'foo100'
foo<01-100> # matches 'foo01', 'foo02' ... 'foo99', 'foo100'
`
INTERSECTION
``````bash
aaa.+&.+bbb # matches 'aaabbb'
`
ANYSTRING
`````@`````オペレーターを`````&`````および`````~`````オペレーターと組み合わせて「すべてを除く」ロジックを作成できます。例えば:
``````bash
@&~(abc.+) # matches everything except terms beginning with 'abc'
`
NONE
- すべてのオプションのオペレーターを無効にします。
サポートされていないオペレーター
Luceneの正規表現エンジンは、^
(行の先頭)や$
(行の末尾)などのアンカーオペレーターをサポートしていません。用語に一致させるには、正規表現が全体の文字列に一致する必要があります。