注意
MongoDBは、改良された全文検索ソリューションであるMongoDB Search、およびベクトル検索ソリューションであるMongoDB Vector Searchを提供します。テキスト インデックスの代わりに、MongoDB Search インデックス または MongoDB Vector Search インデックス を使用することをお勧めします。
大規模なデータセットで $text クエリを実行すると、単一フィールドのテキストインデックスが多数のエントリをスキャンして結果を返す可能性があり、クエリが遅くなる可能性があります。
クエリのパフォーマンスを向上させるには、複合テキストインデックスを作成し、$text クエリに等価一致を含めます。複合インデックスに等価一致で使用されるフィールドが含まれている場合、インデックスはスキャンするエントリを少なくし、結果をより速く返します。
このタスクについて
この例では、店舗マネージャーは、次のドキュメントを含むinventoryコレクションをクエリしています。
db.inventory.insertMany( [ { _id: 1, department: "tech", description: "lime green computer" }, { _id: 2, department: "tech", description: "wireless red mouse" }, { _id: 3, department: "kitchen", description: "green placemat" }, { _id: 4, department: "kitchen", description: "red peeler" }, { _id: 5, department: "food", description: "green apple" }, { _id: 6, department: "food", description: "red potato" } ] )
マネージャーは、特定の部門内のアイテムに対して $text クエリを実行します。
フィールドと フィールドに複合テキスト インデックスを設定すると、スキャンされるインデックスdepartmentdescription キーが指定されたdepartment 内のドキュメントのみに制限されます。複合テキスト インデックスは、 descriptionフィールドの単一フィールド テキスト インデックスと比較してパフォーマンスが向上します。
手順
次のフィールドを含む複合インデックスをinventoryコレクションに作成します。
departmentフィールドの昇順または降順のインデックス キーdescriptionフィールドのtextインデックス キー
db.inventory.createIndex( { department: 1, description: "text" } )
結果
複合インデックスを作成すると、$text クエリは departmentフィールドの指定された等価条件に一致するドキュメントのみをスキャンします。
たとえば、次のクエリは、 departmentがkitchenに等しく、 descriptionフィールドに string greenが含まれるドキュメントをスキャンします。
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )
出力:
[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]
検査されたドキュメント数の表示
クエリを返すまでにスキャンされたドキュメント数を確認するには、クエリのexecutionStatsを表示します。
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } ).explain("executionStats")
検査されたインデックスキーの数はtotalKeysExaminedフィールドに表示されます。 より多くのインデックス キーを調べるクエリは、通常完了までの時間がかかります。
departmentとdescriptionの複合インデックスでは、クエリは1 つのインデックスキーのみを検索します。 コレクションには、 departmentがkitchenで、 descriptionに string greenが含まれているドキュメントが 1 つだけあります。
ただし、クエリがdescriptionフィールドのみで単一フィールド テキスト インデックスを使用する場合、クエリは3 つのインデックス キーを検索します。 コレクションには 3 つのドキュメントがあり、 descriptionフィールドに string greenが含まれています。
前の例で使用されているような小規模なコレクションでは、単一フィールド インデックスと複合テキスト インデックスのパフォーマンスに大きな違いはありません。 ただし、大規模なコレクションでは、インデックス エントリスキャンが増加するとパフォーマンスが著しく低下する可能性があります。 最高のパフォーマンスを得るには、等価一致に最適化するためにスキャンされたインデックスエントリ数を制限したテキストインデックスを作成します。