自己管理型配置でのワイルドカードのテキストインデックスの作成
コレクション内のstringデータを持つすべてのドキュメント フィールドを含むテキスト インデックスを作成できます。 これらのテキスト インデックスは、ワイルドカード テキスト インデックスと呼ばれます。 ワイルドカード テキスト インデックスは、不明なフィールド、任意のフィールド、または動的に生成されたフィールドに対するテキスト検索をサポートしています。
ワイルドカード テキスト インデックスを作成するには、インデックスキーをワイルドカード指定子( $**
)に設定し、インデックス値をtext
に設定します。
db.<collection>.createIndex( { "$**": "text" } )
このタスクについて
ワイルドカード テキスト インデックスは、ワイルドカードインデックス とは異なります。 ワイルドカード テキスト インデックスは$text
演算子を使用するクエリをサポートしますが、ワイルドカード インデックスは サポートされません 。
注意
$text
は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。
ワイルドカード テキスト インデックスの作成後、ドキュメントを挿入またはアップデートすると、インデックスはアップデートされ、新しい string フィールド値が含まれます。 その結果、ワイルドカード テキスト インデックスは挿入とアップデートのパフォーマンスに悪影響を及ぼします。
ワイルドカード テキスト インデックスは、インデックスを作成するフィールドが不明または変更される可能性がある場合にのみ使用してください。 ワイルドカード テキスト インデックスは、特定のフィールドに対象を絞ったテキスト インデックスほどパフォーマンスが良くありません。 対象を絞ったインデックスを作成できないような任意のフィールド名がコレクションに含まれている場合は、一貫したフィールド名になるようにスキーマを改造することを検討してください。 対象を絞ったインデックスの詳細については、「クエリをサポートするインデックスの作成 」を参照してください。
始める前に
次のドキュメントを使用して blog
コレクションを作成します。
db.blog.insertMany( [ { _id: 1, content: "This morning I had a cup of coffee.", about: "beverage", keywords: [ "coffee" ] }, { _id: 2, content: "Who likes chocolate ice cream for dessert?", about: "food", keywords: [ "poll" ] }, { _id: 3, content: "My favorite flavors are strawberry and coffee", about: "ice cream", keywords: [ "food", "dessert" ] } ] )
手順
blog
コレクションにワイルドカード テキスト インデックスを作成します。
db.blog.createIndex( { "$**": "text" } )
結果
ワイルドカード テキスト インデックスは、コレクション内のすべてのフィールドに対するテキスト検索クエリをサポートしています。 次のクエリを考えてみましょう。
1 つの単語を検索
blog
コレクションで string coffee
をクエリします。
db.blog.find( { $text: { $search: "coffee" } } )
出力:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ] }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] } ]
上記のクエリでは、任意の フィールドにstring coffee
が含まれるすべてのドキュメントが返されます。
複数のタームを検索
string poll
またはcoffee
を含むドキュメントをblog
コレクションでクエリします。
db.blog.find( { $text: { $search: "poll coffee" } } )
出力:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ] }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] }, { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'poll' ] } ]
上記のクエリでは、任意の フィールドにstring poll
または coffee
を含むドキュメントが返されます。
正確な文字列の検索
完全な文字列 chocolate ice cream
を含むドキュメントを blog
コレクションでクエリします。
db.blog.find( { $text: { $search: "\"chocolate ice cream\"" } } )
出力:
[ { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'poll' ] } ]
上記のクエリでは、任意のフィールドに完全な文字列 chocolate ice cream
が含まれるドキュメントが返されます。
詳細
テキスト クエリ結果のランキングを制御する方法については、「自己管理型配置のテキスト検索結果への重みの割り当て 」を参照してください。
複合テキスト インデックスの一部としてワイルドカード テキスト インデックスを含めることができます。 複合テキスト インデックスの詳細については、「 複合テキスト インデックスの作成 」を参照してください。
テキスト検索クエリの例については、
$text
を参照してください。注意
$text
は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。大文字と小文字の区別などのテキストインデックスのプロパティの詳細については、「自己管理型配置のテキストインデックスのプロパティ 」を参照してください。