次の方法で共有


Azure Cosmos DB for MongoDB 仮想コアのテキスト インデックスを使用した検索とクエリ

適用対象: MongoDB 仮想コア

Azure Cosmos DB for MongoDB 仮想コアが提供する主な機能の 1 つは、テキスト ベースのデータの効率的な検索とクエリを可能にするテキスト インデックス作成です。 サービスでは、バージョン 2 のテキスト インデックスが実装されています。 バージョン 2 では大文字と小文字の区別はサポートされますが、分音記号の区別はサポートされていません。

Azure Cosmos DB for MongoDB のテキスト インデックスは、テキストベースのクエリを最適化し、高速かつ効率的に行う特別なデータ構造です。 ドキュメント、アーティクル、コメント、その他のテキストが多いデータなどのテキスト コンテンツを処理するように設計されています。 テキスト インデックスでは、トークン化、語幹検索、ストップ ワードなどの手法を使用して、テキストベースの検索のパフォーマンスを向上させるインデックスを作成します。

前提条件

テキスト インデックスを定義する

わかりやすくするために、次のセットアップを使用するブログ アプリケーションの例を考えてみましょう。

  • データベース名: cosmicworks
  • コレクション名: products

このアプリケーション例では、次の構造を持つドキュメントとしてアーティクルを格納します。

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": "John Doe",
  "category": "Technology",
  "published": true
}
  1. title フィールドにテキスト インデックスを作成するには、createIndex メソッドを text オプションと共に使用します。

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    Note

    コレクションごとに 1 つのテキスト インデックスのみを定義できますが、Azure Cosmos DB for MongoDB 仮想コアでは、複数のフィールドにテキスト インデックスを作成して、ドキュメント内の異なるフィールド間でテキスト検索を実行できます。

  2. 必要に応じて、title および content フィールドの両方で検索をサポートするインデックスを作成します。

    db.products.createIndex({ title: "text", content: "text" })
    

テキスト インデックス オプションを構成する

Azure Cosmos DB for MongoDB のテキスト インデックスには、動作をカスタマイズするためのいくつかのオプションが用意されています。 たとえば、テキスト分析用の言語を指定したり、特定のフィールドに優先順位を付ける重みを設定したり、大文字と小文字を区別しない検索を構成したりできます。 オプションを使用してテキスト インデックスを作成する例を次に示します。

  1. 英語をサポートする title および content フィールドの両方で検索をサポートするインデックスを作成します。 また、検索結果で優先順位を付けるために、title フィールドに高い重みを割り当てます。

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

テキスト インデックスへの重み付け

テキスト インデックスを作成する場合に、インデックス内の個々のフィールドに異なる重みを割り当てことができます。 これらの重みは、検索の各フィールドの重要度または関連性を表します。 Azure Cosmos DB for MongoDB 仮想コアでは、テキスト検索クエリの実行時に検索語句に基づいて、各ドキュメントのスコアと割り当てられた重みを計算します。 スコアは、検索クエリに対するドキュメントの関連性を表します。

  1. title および content フィールドの両方で検索をサポートするインデックスを作成します。 "title" フィールドに重み 2 を、"content" フィールドに重み 1 を割り当てます。

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    Note

    クライアントが "Cosmos DB" という用語を使用してテキスト検索クエリを実行すると、コレクション内の各ドキュメントのスコアは、"title" フィールドと "content" フィールドの両方の用語の存在と頻度に基づいて計算されます ("title" フィールドは重みが大きいため、重要度が高くなります)。

テキスト インデックスを使用してテキスト検索を実行する

テキスト インデックスが作成されたら、クエリで "text" 演算子を使用してテキスト検索を実行できます。 テキスト演算子は検索文字列を取得し、テキスト インデックスと照合して関連するドキュメントを検索します。

  1. 語句 Cosmos DB のテキスト検索を実行します。

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. 必要に応じて、クエリで $meta 射影演算子と textScore フィールドを使用して重みを確認します

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

テキスト インデックスの削除

MongoDB でテキスト インデックスを削除するには、コレクションで dropIndex() メソッドを使用し、削除するテキスト インデックスのインデックス キーまたは名前を指定します。

  1. キーを明示的に指定して、テキスト インデックスを削除します。

    db.products.dropIndex({ title: "text" })
    
  2. 必要に応じて、自動生成された一意の名前を指定してテキスト インデックスを削除します。

    db.products.dropIndex("title_text")
    

テキスト インデックスの制限事項

  • コレクションに定義できるテキスト インデックスは 1 つだけです。
  • テキスト インデックスではシンプルなテキスト検索をサポートし、正規表現検索などの高度な検索機能を提供しません。
  • Hint() では、$text 式を使用するクエリとの組み合わせはサポートされていません。
  • 並べ替え操作では、MongoDB のテキスト インデックスの順序を利用できません。
  • テキスト インデックスは比較的大きくなる可能性があり、他のインデックスの種類と比較して大量の記憶域を消費します。

次のステップ