テキスト検索を使用する

Cloud Firestore のテキスト検索機能を使用して、コレクション内の特定の文字列を検索します。

始める前に

テキスト検索の使用を開始する前に、次の操作を行います。

  1. 既存の MongoDB 互換オペレーション データベースにアクセスできることを確認します。または、データベースを作成して接続します。

  2. テキスト インデックスがあることを確認するか、テキスト インデックスを作成します。

テキスト検索では、フィルタ内で $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 で並べ替えることができません。