Docs Menu
Docs Home
/
Atlas
/ /

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

クエリが非効率な正規表現マッチングに依存している場合は、Atlas Search クエリを作成して実行し、$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" と "MICHAEL" の両方の 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値の詳細については、 照合ドキュメント を参照してください

アプリケーションが大文字小文字を区別しないインデックスを使用するには、正規表現クエリでインデックスの同じ照合ドキュメントを指定する必要があります。以前のfind()メソッドから$regex演算子を削除して新しく作成されたインデックスを使用することもできますが、$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 クエリを使用することを推奨します。

  • Atlas Search クエリの詳細については、「クエリとインデックス」を参照してください。

  • 大文字と小文字を区別しないインデックスの詳細な例については、「 大文字と小文字を区別しないインデックス 」を参照してください

  • MongoDB の正規表現クエリの詳細については、「 $regex 」を参照してください。

  • MongoDB University では、MongoDB パフォーマンスの最適化に関する無料コースを提供しています。 詳しくは、「モニタリングとインサイト 」を参照してください。

戻る

コレクションの削減

項目一覧