Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Atlas Search を使用して全文正規表現クエリを実行する

項目一覧

  • 非効率的な正規表現の一致を避ける
  • 詳細

クエリが非効率的な正規表現一致に依存している場合は、 $search 集計パイプライン ステージで Atlas Search クエリ を作成して実行 し、クエリ パラメータをカスタマイズするための他のオプションがあるテキスト クエリのパフォーマンスを向上させます。

大文字と小文字を区別しない正規表現クエリ(i オプションを使用)を頻繁に実行する場合は、 $search 集計パイプライン ステージを使用する Atlas Search クエリ を使用することをお勧めします。

インデックスに 照合を指定すると、大文字と小文字やアクセント記号のルールなど、 string比較の言語固有のルールを定義できます。 ただし、照合Atlas Search クエリと比較して機能がいくつか失われる可能性があります。 Atlas Search 以外の環境では、大文字と小文字を区別しないインデックスでは正規表現クエリのパフォーマンスは向上しません。 $regexクエリ演算子は照合に対応していないため、大文字と小文字を区別しないインデックスを効果的に使用することはできません。 Atlas Search インデックスを使用すると、大文字と小文字を区別するクエリのパフォーマンスが大幅に向上し、クエリ パラメータをカスタマイズするオプションが増えます。

次のドキュメントを含むemployeesコレクションについて考えてみます。 このコレクションには、デフォルトの_idインデックス以外のインデックスはありません。

// employees collection
{
"_id": 1,
"first_name": "Hannah",
"last_name": "Simmons",
"dept": "Engineering"
},
{
"_id": 2,
"first_name": "Michael",
"last_name": "Hughes",
"dept": "Security"
},
{
"_id": 3,
"first_name": "Wendy",
"last_name": "Crawford",
"dept": "Human Resources"
},
{
"_id": 4,
"first_name": "MICHAEL",
"last_name": "FLORES",
"dept": "Sales"
}

アプリケーションがfirst_nameフィールドを頻繁にクエリする場合は、一致する名前をより簡単に見つけるために、大文字と小文字を区別しない正規表現クエリを実行するとよいでしょう。 大文字と小文字を区別しない正規表現は、異なるデータ形式にも一致します。上記の例のように、"Michael" と "MICAEL" の両方のfirst_namesがある場合などです。 ただし、 $search 集計パイプライン ステージを使用する Atlas Search クエリ をお勧めします。

ユーザーが string "michael" を検索すると、アプリケーションは次のクエリを実行できます。

db.employees.find( { first_name: { $regex: /michael/i } } )

このクエリは$regexオプションiを指定しているため、大文字と小文字は区別されません。 このクエリでは次のドキュメントが返されます。

{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" }
{ "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }

このクエリは期待されるドキュメントを返しますが、インデックス サポートのない大文字と小文字を区別しない正規表現クエリのパフォーマンスはあまり良くありません。 パフォーマンスを向上させるには、Atlas Search インデックスを作成します。

{
"mappings": {
"dynamic": true
}
}

照合により、一部の機能が失われる可能性があります。 インデックスのcollationドキュメントのstrengthフィールドが1または2の場合、インデックスは大文字と小文字を区別しません。 照合ドキュメントとさまざまなstrength値の詳細については、 照合ドキュメント を参照してください

アプリケーションで大文字と小文字を区別しないインデックスを使用するには、正規表現クエリのインデックスと同じ照合ドキュメントも指定する必要があります。 $regex前の メソッドからfind() 演算子を削除して、新しく作成されたインデックスを使用することもできますが、 $search 集計パイプライン ステージを使用する クエリAtlas Search を使用することをお勧めします。

大文字と小文字を区別しないクエリ
Atlas Search クエリ
db.employees.find( { first_name: "michael" } ).collation( { locale: 'en', strength: 2 } )
db.employees.aggregate([
{
$search: {
"index": "default",
"text": {
"path": "first_name",
"query": "michael"
}
}
}
])

重要

クエリで大文字と小文字を区別しないインデックスを使用する場合は、 $regex演算子を使用しないでください。 $regexの実装は照合順序に対応していないため、大文字と小文字を区別しないインデックスを使用できません。 代わりに、 $search 集計パイプライン ステージを使用する Atlas Search クエリ を推奨します。

戻る

検索パフォーマンス