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 |
---|---|---|---|---|
query | 文字列または複数の文字列の配列 | 検索する文字列または複数の文字列。 | はい | |
path | 文字列または複数の文字列の配列 | インデックス付きフィールドまたは検索するフィールド。ワイルドカード パスを指定して検索することもできます。詳しくは、「パスの構築」を参照してください。 | はい | |
allowAnalyzedField | ブール値 | 分析対象フィールドに対してクエリを実行する場合は、 true に設定する必要があります。 | no | false |
score | オブジェクト | 一致する検索タームの結果に割り当てるスコア。 次の選択肢があります。
| no |
動作
regex
はタームレベルの演算子であり、 query
フィールドは分析されないことを意味します。 正規表現検索はキーワード アナライザと連携します。フィールドは一度に 1 単語ずつインデックス化されるためです。 大文字と小文字を区別する検索をする場合は、デフォルトのアナライザである標準 アナライザを使用しないでください。 standard
アナライザはすべてのタームを大文字と小文字であるため、 代わりに別のアナライザを指定してください。
allowAnalyzedField
オプションをtrue
に設定することで、 regex
演算子を使用して分析フィールドで検索を実行することは可能ですが、予期しない結果が生じる可能性があります。
例
keyword
アナライザでインデックス付けされたフィールドで *Star Trek*
を検索すると、任意のコンテキストでフィールドに文字列Star Trek
が含まれるすべてのドキュメントが見つかります。標準アナライザでフィールドにインデックス付けされた *Star
Trek*
を検索しても何も見つかりません。これは、 Star
とTrek
の間にスペースがあり、インデックスにスペースが含まれていないためです。
Lucene 正規表現の動作
Atlas Searchregex
演算子は Lucene 正規表現エンジン を使用します は、 Perl 互換正規表現とは異なります。
予約文字
次の文字は、正規表現で使用される場合、演算子として予約されます。
. ? + * | { } [ ] ( ) < > " \ @ #
上記の文字を文字通り使用するには、その前に\
文字を付けます。
例
who\?
に一致します
mongosh
またはドライバーとともにエスケープ文字を使用する場合は、エスケープ文字の前にdoubleバックスラッシュを使用する必要があります。
例
リテラル アスタリスクを含む任意の文字列を検索するワイルドカード式を作成するには、次の式を使用します。
"*\\**"
最初と最後のアスタリスクは任意の文字に一致するワイルドカードとして機能し、\\*
はリテラルのアスタリスクに一致します。
注意
次の式を使用して、リテラルのバックスラッシュをエスケープします。
"*\\\*"
サポートされている演算子
演算子 | 説明 | 例 |
---|---|---|
. | 任意の文字と一致します。 | x.z matches "xyz", "xaz", etc. |
? | 先行する文字は任意であり、1 回以上出現する場合は一致します。 | xyz? "xy" と "xyz" に一致 |
+ | 先行する文字は 1 回以上出現する場合は一致します。 | xy+ は "xy"、"xyy"、"xyy" などに一致します。 |
* | 先行する文字は、一定回出現する場合は一致します。 | xyz* は "xy"、"xyz"、"xyz" などに一致します。 |
| | OR 演算子。 | 演算子の両端にある 2 つのパターンのうち長いものが一致する場合、式は一致します。 | abc|xyz "abc" または "xyz" に一致します |
{<number>} | 先行する文字は、"number"<number> 回完全に出現する場合は一致します。 | xyz{3} "xyzz" に一致します |
() | 括弧内の文字は、マッチング目的で単一の単位として扱われます。 | xyz(abc)[2] "xyzabc" に一致します |
[] | 角括弧で囲まれた任意の文字と一致します。 先頭に 角括弧内では、 | [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 |
<> | 数値範囲に一致します。 | <1-3> は "1"、"2"、および "3" に一致します |
# | 空の言語演算子。 # 演算子は、空の string を含むどの string とも一致しません。 | #|xyz が "xyz" と一致し、それ以外のものと一致しない |
サポートされていない演算子
regex
は、アンカー演算子^
と$
をサポートしていません。
例
次の例では、キーワード アナライザ を使用するカスタム インデックス定義を持つ sample_mflix
データベースの movies
コレクションを使用します。クラスターに サンプル データセット がある場合は、movies
コレクションに Atlas Search インデックスを作成し、クラスターでサンプル クエリを実行できます。
Tip
サンプル データセットをすでに読み込んでいる場合は、「Atlas Search スタートガイド」チュートリアルに従って、インデックスの定義を作成し、Atlas Search クエリを実行します。
インデックスの定義
次のインデックス定義は、キーワード アナライザを使用して、movies
コレクションの title
フィールドにインデックスを作成します。
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 } 8 } 9 } 10 }
次の例では、すべての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" }