regex
定義
regex
regex
はquery
フィールドを正規表現として解釈します。regex
はタームレベルの演算子であり、query
フィールドは分析されません。以下も参照してください。
注意
regex
演算子で使用できる正規表現言語は、 PCREライブラリの限定的なサブセットです。詳細については、 クラス正規表現 を参照してください ドキュメント。
構文
regex
の構文は次のとおりです。
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "regex": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "allowAnalyzedField": <boolean>, 8 "score": <options> 9 } 10 } 11 }
オプション
regex
では、次の用語を使用してクエリを作成します。
フィールド | タイプ | 説明 | 必要性 | default |
---|---|---|---|---|
| 文字列または複数の文字列の配列 | 検索する文字列または複数の文字列。 | はい | |
| 文字列または複数の文字列の配列 | インデックス付きフィールドまたは検索するフィールド。ワイルドカード パス を指定して検索することもできます。 | はい | |
| ブール値 | 分析対象フィールドに対してクエリを実行する場合は、 | no |
|
| オブジェクト | 一致する検索タームの結果に割り当てるスコア。 次の選択肢があります。
| no |
動作
regex
はタームレベルの演算子であり、 query
フィールドは分析されないことを意味します。 正規表現検索はキーワード アナライザと連携します。フィールドは一度に 1 単語ずつインデックス化されるためです。 大文字と小文字を区別する検索をする場合は、デフォルトのアナライザである標準 アナライザを使用しないでください。 standard
アナライザはすべてのタームを大文字と小文字であるため、 代わりに別のアナライザを指定してください。
allowAnalyzedField
オプションをtrue
に設定することで、 regex
演算子を使用して分析フィールドで検索を実行することは可能ですが、予期しない結果が生じる可能性があります。
例
キーワードアナライザでインデックス付けされたフィールドで を検索すると、任意のコンテキストでフィールドに .*Star Trek.*
string が含まれるすべてのドキュメントが見つかります。標準アナライザでフィールドにインデックス付けされたStar Trek
.*Star
Trek.*
を検索しても何も見つかりません。これは、 とStar
Trek
の間にスペースがあり、インデックスにスペースが含まれていないためです。
Lucene 正規表現の動作
Atlas Searchregex
演算子は Lucene 正規表現エンジン を使用します は、 Perl 互換正規表現とは異なります。
予約文字
次の文字は、正規表現で使用される場合、演算子として予約されます。
. ? + * | { } [ ] ( ) < > " \ @ #
上記の文字を文字通り使用するには、その前に\
文字を付けます。
例
who\?
に一致します
mongosh
またはドライバーとともにエスケープ文字を使用する場合は、エスケープ文字の前にdoubleバックスラッシュを使用する必要があります。
例
リテラル アスタリスクを含む任意の文字列を検索するワイルドカード式を作成するには、次の式を使用します。
"*\\**"
最初と最後のアスタリスクは任意の文字に一致するワイルドカードとして機能し、\\*
はリテラルのアスタリスクに一致します。
注意
次の式を使用して、リテラルのバックスラッシュをエスケープします。
"*\\\*"
サポートされている演算子
演算子 | 説明 | 例 |
---|---|---|
| 任意の文字と一致します。 |
|
| 先行する文字は任意であり、1 回以上出現する場合は一致します。 |
|
| 先行する文字は 1 回以上出現する場合は一致します。 |
|
| 先行する文字は、一定回出現する場合は一致します。 |
|
|
|
|
| 先行する文字は、"number"<number> 回完全に出現する場合は一致します。 |
|
| 括弧内の文字は、マッチング目的で単一の単位として扱われます。 |
|
| 角括弧で囲まれた任意の文字と一致します。 先頭に 角括弧内では、 | [xyz] matches "x", "y", and "z"[^abc] matches any character except "a", "b", or "c"[a-d] matches "a", "b", "c", or "d"[0-9] matches any numeric character from 0 through 9 |
| 数値範囲に一致します。 |
|
| 空の言語演算子。 |
|
サポートされていない演算子
regex
は、アンカー演算子をサポートしていません。例では、次の演算子はサポートされていません。
^
は、行の先頭に一致します。$
は、行の末尾に一致します。
タームを一致させるには、正規式 が文字列全体と一致する必要があります。
例
次の例では、キーワード アナライザ を使用するカスタム インデックス定義を持つ sample_mflix
データベースの movies
コレクションを使用します。クラスターに サンプル データセット がある場合は、movies
コレクションに Atlas Search インデックスを作成し、クラスターでサンプル クエリを実行できます。
インデックスの定義
次のインデックス定義は、キーワード アナライザを使用して、movies
コレクションの title
フィールドにインデックスを作成します。
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 }, 8 "genres": { 9 "type": "stringFacet" 10 } 11 } 12 } 13 }
次の例では、すべてのtitle
フィールドで、 Seattle
という単語で終わる映画タイトルを検索します。 (.*)
正規表現は、任意の数の文字と一致します。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "(.*) Seattle" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
{ "title" : "Sleepless in Seattle" } { "title" : "Battle in Seattle" }
次の例では、正規表現[0-9]{2} (.){4}s
を使用して、2 桁の数字とそれに続くスペースで始まり、5 文字の単語でs
で終わる映画タイトルを検索します。
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "[0-9]{2} (.){4}s" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
{ "title" : "20 Dates" } { "title" : "25 Watts" } { "title" : "21 Grams" } { "title" : "13 Lakes" } { "title" : "18 Meals" } { "title" : "17 Girls" } { "title" : "16 Acres" } { "title" : "26 Years" } { "title" : "99 Homes" } { "title" : "45 Years" }
次の例では、正規式.*
を使用して、title
のどこにでも summer
タームが含まれる映画タイトルを検索し、各ジャンルで条件に一致する映画の数を返します。
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "regex": { 7 "path": "title", 8 "query": ".*summer.*" 9 } 10 }, 11 "facets": { 12 "genresFacet": { 13 "type": "string", 14 "path": "genres" 15 } 16 } 17 } 18 } 19 } 20 ])
[ { count: { lowerBound: Long('6') }, facet: { genresFacet: { buckets: [ { _id: 'Comedy', count: Long('5') }, { _id: 'Fantasy', count: Long('3') }, { _id: 'Romance', count: Long('3') }, { _id: 'Drama', count: Long('2') }, { _id: 'Horror', count: Long('1') }, { _id: 'Mystery', count: Long('1') } ] } } } ]