Docs Menu

テキスト検索の実行(自己管理型配置)

注意

このページでは、自己管理型(Atlas以外)デプロイメントのテキスト クエリ機能について説明します。 MongoDB Atlasでホストされているデータに対して、 MongoDB は改良された全文クエリ ソリューションである Atlas Search とベクトル検索ソリューションである Atlas ベクトル検索 を提供します。

自己管理型配置でテキスト検索クエリを実行するには、コレクションにテキスト インデックスが必要です。 MongoDB は、string コンテンツに対するテキスト検索クエリをサポートするために テキストインデックス を提供します。 テキストインデックスには、値が 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フィールドをテキスト検索で許可します。namedescription

db.stores.createIndex( { name: "text", description: "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は、集計パイプラインでも使用できます。