Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

regex

項目一覧

  • 定義
  • 構文
  • オプション
  • 動作
  • Lucene 正規表現の動作
regex

regexqueryフィールドを正規表現として解釈します。 regexはタームレベルの演算子であり、 queryフィールドは分析されません。

Tip

以下も参照してください。

  • アナライザ。

  • 分析フィールドの例。

注意

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
オブジェクト

一致する検索タームの結果に割り当てるスコア。 次の選択肢があります。

  • boost: 結果のスコアに指定された数値を掛けます。

  • constant: 結果のスコアを指定された数値に置き換えます。

  • function: 結果のスコアを指定された式で置き換えます。

no

regex はタームレベルの演算子であり、 queryフィールドは分析されないことを意味します。 正規表現検索はキーワード アナライザと連携します。フィールドは一度に 1 単語ずつインデックス化されるためです。 大文字と小文字を区別する検索をする場合は、デフォルトのアナライザである標準 アナライザを使用しないでください。 standardアナライザはすべてのタームを大文字と小文字であるため、 代わりに別のアナライザを指定してください。

allowAnalyzedFieldオプションをtrueに設定することで、 regex演算子を使用して分析フィールドで検索を実行することは可能ですが、予期しない結果が生じる可能性があります。

keyword アナライザでインデックス付けされたフィールドで *Star Trek* を検索すると、任意のコンテキストでフィールドに文字列Star Trek が含まれるすべてのドキュメントが見つかります。標準アナライザでフィールドにインデックス付けされた *Star Trek* を検索しても何も見つかりません。これは、 StarTrek の間にスペースがあり、インデックスにスペースが含まれていないためです。

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という単語で終わる映画タイトルを検索します。 (.*)正規表現は、任意の数の文字と一致します。

1db.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で終わる映画タイトルを検索します。

1db.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" }

戻る

範囲