テキスト検索を使用する

MongoDB 互換の 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 で並べ替えできません。