Cloud Firestore のテキスト検索機能を使用して、コレクション内の特定の文字列を検索します。
始める前に
テキスト検索の使用を開始する前に、次の操作を行います。
既存の MongoDB 互換オペレーション データベースにアクセスできることを確認します。または、データベースを作成して接続します。
テキスト インデックスがあることを確認するか、テキスト インデックスを作成します。
テキスト検索を実行する
テキスト検索では、フィルタ内で $text 演算子を使用します。$search 引数でクエリ文字列を指定します。
一般的なテキスト検索を実行する
次のコマンドを実行して、一般的なテキスト検索を行います。
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
インデックスがパーティション分割されている場合は、検索内の「and」等価フィルタにパーティションを含めることで、パーティションに基づいてフィルタリングできます。たとえば、city パーティションがある場合は、次のようにテキスト検索をフィルタできます。
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
パーティションに基づいて集計をフィルタすることもできます。例:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
パーティションの値は文字列にする必要があります。パーティション フィルタは、「and」を使用してテキスト検索に結合する必要があります。
テキスト検索の言語を設定する
テキスト検索の言語は、$language 引数を使用して設定できます。次に例を示します。
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
言語を設定しない場合、検索ではテキスト インデックスの言語が使用されます。
完全一致するキーワードを検索する
完全一致する語句を検索するには、語句を二重引用符で囲んだ一連の単語として構成します。例:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
用語の組み合わせを検索する
テキスト検索の精度を高めるには、一連のキーワードを指定します。たとえば、次の検索では、best AND french AND ("bread" OR "is") の組み合わせに一致するドキュメントが返されます。
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
用語を除外する
テキスト検索からキーワードを除外するには、キーワードの前にハイフン(-)を付けます。
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
関連性スコアを計算する
{$meta: "textScore"} 式を使用して、テキスト検索で一致したドキュメントの関連性スコアを計算します。結果をスコアの降順で並べ替えるには、並べ替え式で $meta を使用します。次の例を考えてみましょう。ここで、SCORE_FIELD はスコア値の保存に使用されるフィールドの名前です。
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
射影式でテキストスコアを使用することもできます。例:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
検索を拡張する
テキスト検索結果の関連性を高めるため、$text 演算子は、指定された言語に従って検索文字列を拡張し、コンテキストを考慮した類義語、語幹形式、スペル修正された用語、発音区別符号のバリエーションなどの一致を含めます。
制限事項
$near演算子と$text演算子は、同じテキスト検索で使用できません。findまたはaggregation検索ごとに 1 つの$text演算子を使用できます。- 集計では、
$textを含む$matchステージが最初のパイプライン ステージである必要があります。 $textは、$andと$orの内部にのみネストできます。$textが$or内にある場合、検索以外の選言は、既存の順序付きインデックスを使用して検索を最適化できます。他の選言がインデックスに登録されていない場合、検索はコレクション スキャンに依存します。$textはヒントと一緒に使用できません。- テキスト検索を含むクエリは
$naturalで並べ替えることができません。