クエリが正規表現の一致に依存する場合は、 MongoDB Searchインデックスを作成し、 $search集計パイプラインステージを実行中ことでクエリのパフォーマンスと効率を向上させることができます。 は常にインデックスを使用できないため非効率的ですが、$regex MongoDB Search インデックスはクエリのパフォーマンスを大幅に向上させ、クエリ パラメータをカスタマイズするオプションを増やします。
このページでは、 の一般的なユースケースにおけるMongoDB Search$regex のインデックスとクエリ構成について説明します。
例
例ではsample_mflix.movies 名前空間を使用します。サンプルクエリを実行するには、このコレクションをクラスターに追加するか、 MongoDB Search Playground で事前構成されたスナップショットを使用します。サンプルクエリは、次のユースケースで$search $regexではなく を使用する方法を示しています。
アプリケーションが1 セットの文字またはプレフィックスで始まる string$regex ^値を頻繁にクエリする場合は、string 値の先頭から検索する オプション と、次のケースを作成するi を使用することがあります。区別されない。
代わりに、 集計パイプラインステージを使用するMongoDB Search $searchクエリを推奨します。次のクエリでは、プレフィックスback で始まる映画タイトルを検索します。
➤ MongoDB Search Playground でこれを試してみてください。
$regex クエリ | $search クエリ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
この$search クエリを実行するには、次のようなMongoDB Searchインデックスを作成します。
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "string", "analyzer": "autocomplete-search", "searchAnalyzer": "lucene.standard" } ] } }, "analyzers": [ { "name": "autocomplete-search", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "edgeGram", "minGram": 4, "maxGram": 10 } ] } ] }
このインデックス定義は、インデックス付きフィールドに autocomplete-searchカスタムアナライザを使用し、クエリに lucene.standardアナライザを使用する string タイプとして、moviesコレクション内の titleフィールドをインデックス化します。インデックス フィールド用の analyzer として autocomplete-search と名前付けされ、クエリ用の searchAnalyzer として lucene.standard という名前のカスタムアナライザ。という名前のカスタムアナライザ
lowercaseトークンフィルター : すべての文字を小文字に変換し、大文字と小文字を区別しないクエリをサポートしますedgeGramトークンフィルターを使用して、長さが4文字と10文字の間のトークンを作成します
注意
このカスタムアナライザは、長さが最大 10 文字までの単語のみをサポートします。 10 文字を超える単語とクエリを予想する場合は、maxGram の値を増やしてください。 maxGram の値を 15 より大きく設定することはお勧めしません。値が大きいとインデックスのサイズが大きくなり、パフォーマンスと可用性に影響可能性があるためです。
アプリケーションがフィールドのどこにでも存在する文字列を頻繁にクエリする場合は、$regex クエリを実行することがあります。このクエリではすべてのドキュメントがチェックされ、すべての一致が特定の順序で返されません。
代わりに、 集計パイプラインステージを使用するMongoDB Search $searchクエリを推奨します。次のクエリは、park titleフィールドのどこにでも タームが含まれる映画タイトルを検索します。
➤ MongoDB Search Playground でこれを試してみてください。
$regex クエリ | $search クエリ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
この$search クエリを実行するには、次の定義でMongoDB Searchインデックスを作成します。
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "contains", "searchAnalyzer": "lucene.standard" } } }, "analyzers": [ { "name": "contains", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "reverse" }, { "type": "edgeGram", "minGram": 4, "maxGram": 15 }, { "type": "reverse" } ] } ] }
このインデックス定義は、次を適用する contains という名前のカスタムアナライザを使用して、moviesコレクション内の titleフィールドを string 型としてインデックス化します。
standardトークナイザ を使用して、単語を空白または句読点で分裂。lowercaseトークン フィルター を使用して、文字を小文字に変換し、大文字と小文字を区別しないクエリをサポートします。reverseトークンフィルター(2 回)を使用して単語を逆にして、効率的な非アクティブなクエリをサポートします。edgeGramトークン フィルターを使用して、4 文字から 15 文字の長さのトークンを作成します。
注意
このカスタムアナライザは、長さが最大 15 文字までの単語のみをサポートします。 15 文字を超える単語がある場合は、maxGram の値を増やしてください。 maxGram の値を 15 より大きく設定することは推奨されません。値が大きいとインデックスのサイズが大きくなり、パフォーマンスと可用性に影響可能性があるためです。
アプリケーションが1 セットの文字またはサフィックスで終わる string $フィールド値を頻繁にクエリする場合は、string 値の末尾を検索する $regex オプション と オプションi を使用して正規表現クエリを実行することができますにより、大文字と小文字が区別されなくなります。
代わりに、 集計パイプラインステージを使用するMongoDB Search $searchクエリを推奨します。次のクエリでは、ring というタームで終わる映画タイトルが検索されます。
➤ MongoDB Search Playground でこれを試してみてください。
$regex クエリ | $search クエリ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
この$search クエリを実行するには、次のようなMongoDB Searchインデックスを作成します。
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "autocomplete", "minGrams": 4, "maxGrams": 10, "analyzer": "lucene.keyword", "tokenization": "rightEdgeGram" } ] } } }
このインデックス定義は、以下を使用して titleフィールドをインデックス化します。
rightEdgeGramトークン化戦略を持つautocompleteタイプは、テキストを 4(最小)文字から 10(最大)文字の長さの部分文字列または「グラム」に分裂。これは、次の末尾から始まる部分的な検索をサポートしますstring。lucene.keywordアナライザは、テキストの末尾のみに一致し、中間単語の末尾には一致しないことを確認します。中間単語の接尾辞一致を検索するには、lucene.standardを使用します。
詳細
MongoDB Search クエリの詳細については、クエリとインデックス を参照してください。
MongoDB の正規表現クエリの詳細については、「 $regex 」を参照してください。
MongoDB University では、MongoDB パフォーマンスの最適化に関する無料コースを提供しています。 詳しくは、「モニタリングとインサイト 」を参照してください。