テキスト検索の実行(自己管理型配置)
注意
このページでは、自己管理型(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
フィールドをテキスト検索で許可します。name
description
db.stores.createIndex( { name: "text", description: "text" } )
完全一致の string を検索
二重引用符で囲むと、正確な複数単語を含む文字列を検索できます。テキスト検索では、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
は、集計パイプラインでも使用できます。