定義
構文
regex の構文は次のとおりです。
{ $search: { "index": <index name>, // optional, defaults to "default" "regex": { "query": "<search-string>", "path": "<field-to-search>", "allowAnalyzedField": <boolean>, "score": <options> } }}オプション
regex では、次の用語を使用してクエリを作成します。
フィールド | タイプ | 説明 | 必要性 | default |
|---|---|---|---|---|
| 文字列または複数の文字列の配列 | 検索する文字列または複数の文字列。 | はい | |
| 文字列または複数の文字列の配列 | 検索対象となるインデックス付きフィールド。ワイルドカード パスを指定して検索することもできます。 | はい | |
| ブール値 | 分析対象フィールドに対してクエリを実行する場合は、 | no |
|
| オブジェクト | 一致する検索タームの結果に割り当てるスコア。 次の選択肢があります。
| no |
動作
regex はタームレベルの演算子であり、 queryフィールドは分析されないことを意味します。 正規表現検索はキーワード アナライザと連携します。フィールドは一度に 1 単語ずつインデックス化されるためです。 大文字と小文字を区別する検索をする場合は、デフォルトのアナライザである標準 アナライザを使用しないでください。 standardアナライザはすべてのタームを大文字と小文字であるため、 代わりに別のアナライザを指定してください。
allowAnalyzedFieldオプションをtrueに設定することで、 regex演算子を使用して分析フィールドで検索を実行することは可能ですが、予期しない結果が生じる可能性があります。
例
キーワード アナライザーでインデックス付けされたフィールドで .*Star Trek.* を検索すると、任意のコンテキストでフィールドに文字列 Star Trek が含まれるすべてのドキュメントが見つかります。標準アナライザでフィールドにインデックス付けされた .*Star Trek.* を検索しても何も見つかりません。これは、 Star とTrek の間にスペースがあり、インデックスにスペースが含まれていないためです。
Lucene 正規表現の動作
MongoDB Searchregex 演算子は、 Perl互換正規表現とは異なる Lucene 正規式エンジンを使用します。
予約文字
次の文字は、正規表現で使用される場合、演算子として予約されます。
. ? + * | { } [ ] ( ) < > " \ @ #
上記の文字を文字通り使用するには、その前に\文字を付けます。
例
who\? に一致します
mongoshまたはドライバーとともにエスケープ文字を使用する場合は、エスケープ文字の前にdoubleバックスラッシュを使用する必要があります。
例
リテラル アスタリスクを含む任意の文字列を検索するワイルドカード式を作成するには、次の式を使用します。
"*\\**"最初と最後のアスタリスクは任意の文字に一致するワイルドカードとして機能し、\\* はリテラルのアスタリスクに一致します。
注意
次の式を使用して、リテラルのバックスラッシュをエスケープします。
"*\\\*"サポートされている演算子
演算子 | 説明 | 例 |
|---|---|---|
| 任意の文字と一致します。 |
|
| 先行する文字は任意であり、1 回以上出現する場合は一致します。 |
|
| 先行する文字は 1 回以上出現する場合は一致します。 |
|
| 先行する文字は、一定回出現する場合は一致します。 |
|
|
|
|
| 先行する文字は、"number"<number> 回完全に出現する場合は一致します。 |
|
| 括弧内の文字は、マッチング目的で単一の単位として扱われます。 |
|
| 角括弧で囲まれた任意の文字と一致します。 先頭に 角括弧内では、 |
|
| 数値範囲に一致します。 |
|
| 空の言語演算子。 |
|
サポートされていない演算子
regex は、アンカー演算子をサポートしていません。例では、次の演算子はサポートされていません。
^、これは行の先頭に一致します。$行の末尾に一致するものです。
タームを一致させるには、正規表現が文字列全体と一致する必要があります。
例
次の例では、キーワード アナライザを使用するカスタム インデックス定義を持つ sample_mflix データベースの movies コレクションを使用します。クラスターに サンプル データセット がある場合は、movies コレクションに MongoDB Search インデックスを作成し、クラスターでサンプル クエリを実行できます。
インデックスの定義
次のインデックス定義は、キーワード アナライザを使用して、movies コレクションの title フィールドにインデックスを作成します。
{ "mappings": { "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "type": "token" } } }}期間位置
次の例では、正規表現 .* を使用して、title 内のどこかに summer という語句を含む映画タイトルを検索し、条件に一致する映画の数をジャンルごとに返します。
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "regex": { "path": "title", "query": ".*summer.*" } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }])次の例では、すべてのtitleフィールドで、 Seattleという単語で終わる映画タイトルを検索します。 (.*)正規表現は、任意の数の文字と一致します。
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": "(.*) Seattle" } } }, { $project: { "_id": 0, "title": 1 } }])数値の範囲
次の例では、正規表現[0-9]{2} (.){4}sを使用して、2 桁の数字とそれに続くスペースで始まり、5 文字の単語でsで終わる映画タイトルを検索します。
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": "[0-9]{2} (.){4}s" } } }, { $project: { "_id": 0, "title": 1 } }])複数単語を含むフレーズ
次の例では、正規式.*Toy Story.* を使用して、Toy Story というフレーズを含むすべての映画タイトルを検索します。検索フィールドでは キーワードアナライザが使用されているため、正規表現 は単語間のスペースを含め、保存されているフレーズと完全に一致します。
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ".*Toy Story.*" } } }, { $project: { "_id": 0, "title": 1 } }])文字列の配列
次の例では、正規式配列を使用して、指定されたパターンのいずれかに一致する映画タイトルを検索します。クエリでは、Seattle で終わる、または Toy Story を含むタイトルが検索されます。
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ["(.*) Seattle", ".*Toy Story.*"] } } }, { $project: { "_id": 0, "title": 1 } }])大文字と小文字を区別する検索
次の例は、大文字と小文字を区別する一致を示しています。インデックスは、各インデックス値の元の大文字と小文字を保持する lucene.keywordアナライザを使用しているため、クエリは保存されたタイトルの大文字と小文字を正確に一致させる必要があります。クエリ .*Sleepless.* は Sleepless in Seattle と一致しますが、.*sleepless.* は結果を返しません。
db.movies.aggregate([ { "$search": { "regex": { "path": "title", "query": ".*sleepless.*" } } }, { $project: { "_id": 0, "title": 1 } }])