Azure DocumentDB が提供する主な機能の 1 つはテキスト インデックス作成です。これにより、テキスト ベースのデータの効率的な検索とクエリが可能になります。 このサービスでは、 バージョン 2 のテキスト インデックスが実装されています。 バージョン 2 では、大文字と小文字の区別はサポートされていますが、分音記号の区別はサポートされていません。
Azure DocumentDB のテキスト インデックスは、テキストベースのクエリを最適化し、より高速で効率的な特殊なデータ構造です。 ドキュメント、記事、コメント、その他のテキストが多いデータなどのテキスト コンテンツを処理するように設計されています。 テキスト インデックスでは、トークン化、ステミング、ストップ ワードなどの手法を使用して、テキストベースの検索のパフォーマンスを向上させるインデックスを作成します。
[前提条件]
Azure サブスクリプション
- Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください
既存の Azure DocumentDB クラスター
- クラスターがない場合は、新しいクラスターを作成します
テキスト インデックスを定義する
わかりやすくするために、次のセットアップを使用したブログ アプリケーションの例を考えてみましょう。
-
データベース名:
cosmicworks -
コレクション名:
products
このアプリケーション例では、次の構造のドキュメントとしてアーティクルを格納します。
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB is a globally distributed, multi-model database service.",
"author": "John Doe",
"category": "Technology",
"published": true
}
createIndexフィールドにテキスト インデックスを作成するには、textオプションでtitleメソッドを使用します。use cosmicworks; db.products.createIndex({ title: "text" })注
コレクションごとに定義できるテキスト インデックスは 1 つだけですが、Azure DocumentDB では複数のフィールドにテキスト インデックスを作成して、ドキュメント内の異なるフィールド間でテキスト検索を実行できます。
必要に応じて、
titleフィールドとcontentフィールドの両方で検索をサポートするインデックスを作成します。db.products.createIndex({ title: "text", content: "text" })
テキスト インデックス オプションを構成する
Azure DocumentDB のテキスト インデックスには、動作をカスタマイズするためのオプションがいくつか用意されています。 たとえば、テキスト分析の言語を指定したり、特定のフィールドに優先順位を付ける重みを設定したり、大文字と小文字を区別しない検索を構成したりできます。 オプションを使用してテキスト インデックスを作成する例を次に示します。
英語がサポートされている
titleフィールドとcontentフィールドの両方で検索をサポートするインデックスを作成します。 また、titleフィールドに高い重みを割り当てて、検索結果で優先順位を付けます。db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
テキスト インデックスの重み付け
テキスト インデックスを作成するときに、インデックス内の個々のフィールドに異なる重みを割り当てることができます。 これらの重みは、検索の各フィールドの重要度または関連性を表します。 Azure DocumentDB は、テキスト検索クエリの実行時に、検索語句に基づいて各ドキュメントのスコアと割り当てられた重みを計算します。 スコアは、検索クエリに対するドキュメントの関連性を表します。
titleフィールドとcontentフィールドの両方で検索をサポートするインデックスを作成します。 "タイトル" フィールドに重み 2、"content" フィールドに重み 1 を割り当てます。db.products.createIndex( { title: "text", content: "text" }, { weights: { title: 2, content: 1 } } )注
クライアントが "DocumentDB" という用語でテキスト検索クエリを実行すると、コレクション内の各ドキュメントのスコアは、"title" フィールドと "content" フィールドの両方の用語の存在と頻度に基づいて計算され、"title" フィールドの重みが大きいため、重要度が高くなります。
テキスト インデックスを使用してテキスト検索を実行する
テキスト インデックスが作成されたら、クエリで "text" 演算子を使用してテキスト検索を実行できます。 テキスト演算子は検索文字列を受け取り、テキスト インデックスと照合して関連するドキュメントを検索します。
フレーズ
DocumentDBのテキスト検索を実行します。db.products.find( { $text: { $search: "DocumentDB" } } )必要に応じて、
$metaプロジェクション演算子とクエリのtextScoreフィールドを使用して重みを確認しますdb.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
テキスト インデックスの削除
MongoDB でテキスト インデックスを削除するには、コレクションで dropIndex() メソッドを使用し、削除するテキスト インデックスのインデックス キーまたは名前を指定します。
キーを明示的に指定して、テキスト インデックスを削除します。
db.products.dropIndex({ title: "text" })必要に応じて、自動生成された一意の名前を指定してテキスト インデックスを削除します。
db.products.dropIndex("title_text")
テキスト インデックスの制限事項
- コレクションに定義できるテキスト インデックスは 1 つだけです。
- Hint() は、$text式を使用したクエリと組み合わせてサポートされていません。
- 並べ替え操作では、MongoDB のテキスト インデックスの順序を使用できません。
- テキスト インデックスは比較的大きくなる可能性があります。他のインデックスの種類と比較して、大量のストレージ領域を消費します。