Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

$text クエリ

注意

MongoDB、改良された全文検索ソリューションである MongoDB Search とセマンティック検索ソリューションである MongoDB Vector Search を提供します。$text 演算子の代わりに、$search$searchMeta、または $vectorSearch ステージを使用することを推奨します。

$text クエリを実行するには、コレクションにテキストインデックスが必要です。MongoDB は、string コンテンツに対する $text クエリをサポートするためのテキストインデックスを提供します。テキストインデックスには、値が string または複数の string 配列である任意のフィールドを含めることができます。コレクションに含められる テキストインデックスは 1 つ だけですが、そのインデックスは複数のフィールドをカバーできます。

動作、トークン化、プロパティを含むテキスト インデックスの詳細な参照については、「自己管理型配置のテキスト インデックス」セクションを参照してください。

この例では、テキストインデックスを作成し、それを使用してテキストフィールドのみを指定してカフェを検索する方法を示します。

次のドキュメントを使用してコレクション stores を作成します。

db.stores.insertMany(
[
{ _id: 1, name: "Java Hut", description: "Coffee and cakes" },
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
{ _id: 3, name: "Coffee Shop", description: "Just coffee" },
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },
{ _id: 5, name: "Java Shopping", description: "Indonesian goods" },
{ _id: 6, name: "NYC_Coffee Shop", description: "local NYC coffee" }
]
)

mongosh で次のコマンドを実行して、name フィールドと description フィールドに対する $text クエリを許可します。

db.stores.createIndex( { name: "text", description: "text" } )

二重引用符で囲むと、正確な複数単語を含む文字列を検索できます。$text クエリは、string 全体を含むドキュメントのみと一致します。

例、次のクエリは、string を含むすべてのドキュメントを検索します。

db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

このクエリは次のドキュメントを返します。

[
{ _id: 3, name: 'Coffee Shop', description: 'Just coffee' },
{ _id: 6, name: 'NYC_Coffee Shop', description: 'local NYC coffee' }
]

指定しない限り、正確な文字列検索では大文字と小文字は区別されず、発音区別符号も区別されません。 例、次のクエリは前のクエリと同じ結果を返します。

db.stores.find( { $text: { $search: "\"COFFEé SHOP\"" } } )

完全一致する string 検索では、ステミングやストップワードは処理されません。

単語を除外するには、先頭に「 - 」文字を付けます。 たとえば、" Java " または "shot" を含み、かつ "coutine" は含まないすべてのストアを検索するには、次のコマンドを使用します。

db.stores.find( { $text: { $search: "java shop -coffee" } } )

MongoDB は、デフォルトではソートされていない順序で結果を返します。 ただし、 $textクエリでは各ドキュメントに対して関連性スコアを計算し、ドキュメントがクエリにどの程度一致するかを指定します。

関連性スコアの順序で結果を並べ替えるには、 $meta textScoreフィールドを明示的にプロジェクションし、そのフィールドで並べ替える必要があります。

db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

$text は、 集計パイプライン でも利用できます。

戻る

テキスト検索

項目一覧