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 クエリ | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
重要
クエリで大文字と小文字を区別しないインデックスを使用する場合は、 $regex演算子を使用しないでください。 $regex
の実装は照合順序に対応していないため、大文字と小文字を区別しないインデックスを使用できません。 代わりに、 $search 集計パイプライン ステージを使用する Atlas Search クエリ を推奨します。
詳細
Atlas Search クエリの詳細については、「 Atlas Search クエリの作成と実行 」を参照してください。
大文字と小文字を区別しないインデックスの詳細な例については、「 大文字と小文字を区別しないインデックス 」を参照してください。
MongoDB の正規表現クエリの詳細については、「 $regex 」を参照してください。
MongoDB University では、MongoDB パフォーマンスの最適化に関する無料コースを提供しています。 詳しくは、「モニタリングとインサイト 」を参照してください。