Docs Menu
Docs Home
/
クラスターの監視
/

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

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

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

インデックスに 照合を指定すると、大文字と小文字やアクセント記号のルールなど、文字列比較の言語固有のルールを定義できます。ただし、照合はMongoDB Search クエリと比較して機能がいくつか失われる可能性があります。MongoDB Search 以外の環境では、大文字と小文字を区別しないインデックスでは正規表現クエリのパフォーマンスは向上しません。$regexクエリ演算子は照合に対応していないため、大文字とユースケースことはできません。MongoDB 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 がある場合などです。ただし、 集計パイプラインステージを使用するMongoDB Search $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" }

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

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

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

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

大文字と小文字を区別しないクエリ
MongoDB 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 の実装は照合順序に対応していないため、大文字と小文字を区別しないインデックスを使用できません。代わりに、 集計パイプラインステージを使用するMongoDB Search $searchクエリを推奨します。

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

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

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

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

項目一覧