自己管理型配置のテキストインデックス
項目一覧
注意
このページでは、自己管理型(Atlas以外)配置のテキスト クエリ機能について説明します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。
Overview
自己管理型配置でテキスト検索クエリを実行するには、コレクションにテキスト インデックスが必要です。 MongoDB provides text indexes to support text search queries on string content. Text indexes can include any field whose value is a string or an array of string elements. コレクションに含められるテキスト検索インデックスは1 つだけですが、そのインデックスは複数のフィールドをカバーできます。
互換性
MongoDB Atlas でホストされている配置にはテキストインデックスを使用できます。
MongoDB Atlas でホストされている配置のインデックスの管理の詳細については、「インデックスの作成、表示、削除、および非表示 」を参照してください。
バージョン
テキストインデックスには 3 つのバージョンがあります。 デフォルトでは、MongoDB は新しいテキストインデックスを含むバージョン 3 を使用します。
デフォルトを上書きして古いバージョンを使用するには、インデックスを作成するときに textIndexVersion
オプションを使用します。
テキストインデックスの作成
重要
コレクションには最大1 つのtext
インデックスを含めることができます。
Atlas Search ( MongoDB Atlasで利用可能 )は、単一のコレクションに対して複数の全文検索インデックスをサポートします。 詳しくは、 Atlas Search のドキュメントを参照してください。
text
インデックスを作成するには、 db.collection.createIndex()
メソッドを使用します。 stringまたはstring配列を含むフィールドをインデックス化するには、次の例のように、フィールドを含め、インデックス ドキュメントにstringリテラル "text"
を指定します。
db.reviews.createIndex( { comments: "text" } )
text
インデックスでは複数のフィールドにインデックスを付けることができます。 次の例では、フィールドsubject
とcomments
にtext
インデックスを作成しています。
db.reviews.createIndex( { subject: "text", comments: "text" } )
複合インデックスには、昇順および降順のインデックス キーと組み合わせてtext
インデックス キーを含めることができます。 詳細については、「複合インデックス 」を参照してください。
text
インデックスを削除するには、インデックス名を使用します。 詳細については、「 インデックス名を使用してtext
インデックスを削除する 」を参照してください。
重みの指定
text
インデックスの場合、インデックス付きフィールドの重みは、テキスト検索スコアに関して他のインデックス付きフィールドと比較したフィールドの重要性を示します。
ドキュメント内の各インデックス付きフィールドについて、MongoDB は一致の数に重みを掛けて結果を合計します。 MongoDB はこの合計を使用して、ドキュメントのスコアを計算します。 テキスト スコアによる返却と並べ替えの詳細については、 $meta
演算子を参照してください。
インデックス フィールドのデフォルトの重みは 1 です。 インデックス フィールドの重みを調整するには、 db.collection.createIndex()
メソッドにweights
オプションを含めます。
重みを使用してテキスト検索の結果を制御する方法の詳細については、「自己管理型配置のテキスト検索結果への重みの割り当て 」を参照してください。
ワイルドカード テキスト インデックス
注意
ワイルドカード テキスト インデックスは、ワイルドカードインデックス とは異なります。 ワイルドカード インデックスは$text
演算子を使用するクエリをサポートしていません。
ワイルドカード テキスト インデックスとワイルドカード インデックスはワイルドカード$**
フィールド パターンを共有しますが、インデックス タイプは異なります。 ワイルドカード テキスト インデックスのみが$text
演算子をサポートします。
複数のフィールドにtext
インデックスを作成する場合は、ワイルドカード指定子( $**
)を使用することもできます。 ワイルドカード テキスト インデックスを使用すると、MongoDB はコレクション内の各ドキュメントの string データを含むすべてのフィールドにインデックスを作成します。 次の例では、ワイルドカード指定子を使用してテキスト インデックスを作成しています。
db.collection.createIndex( { "$**": "text" } )
このインデックスにより、string コンテンツを持つすべてのフィールドのテキスト検索が可能になります。 このようなインデックスは、テキストインデックスやアドホッククエリに含めるフィールドが不明な場合、高度に非構造化されたデータに役立ちます。
ワイルドカード テキスト インデックスは、複数のフィールドのtext
インデックスです。 そのため、インデックスの作成時に特定のフィールドに重みを割り当てて、結果のランキングを制御できます。 重みを使用してテキスト検索の結果を制御する方法の詳細については、「自己管理型配置のテキスト検索結果への重みの割り当て 」を参照してください。
ワイルドカード テキスト インデックスは、すべてのテキスト インデックスと同様に、複合インデックスの一部にすることができます。 たとえば、次の例では、フィールドa
と ワイルドカード指定子に複合インデックスが作成されます。
db.collection.createIndex( { a: 1, "$**": "text" } )
すべての複合テキスト インデックスと同様に、 a
がテキスト インデックス キーに先行するため、このインデックスで$text
検索を実行するには、クエリ述語に等価一致条件a
が含まれている必要があります。 複合テキスト インデックスの詳細については、「複合テキスト インデックス 」を参照してください。
大文字と小文字の区別なし
バージョン3text
インデックスは、一般的なC
、単純なS
、およびトルコ語の言語でT
Unicode8.0 文字データベース大文字 と小文字の をサポートしています。 。
大文字と小文字のフォールディングは、 text
インデックスの大文字と小文字を区別しない範囲を拡大して、 é
やÉ
などの発音区別符号付き文字や、キリル文字の "適用" や "ped" など、非ラテン文字の文字を含めます。 。
text
インデックスのバージョン3も、発音区別符号を区別しません 。 そのため、インデックスではé
、 É
、 e
、 E
の間も区別されません。
text
インデックスの以前のバージョンでは、 [A-z]
のみで大文字と小文字が区別されませんでした。つまり、非発音区別符号以外のラテン文字のみ では大文字と小文字は区別されません。 テキストインデックスの以前のバージョンでは、他のすべての文字は別の文字として扱われます。
発音区別符号の区別なし
バージョン3では、 text
インデックスは発音区別符号を区別しません。 つまりインデックスでは、 é
、 ê
、 e
など、発音区別符号を含む文字と含まない文字を区別しません。 具体的には、 インデックスは、text
Unicode8 で発音区別符号として分類された文字を削除します。0 文字データベースのプロンプト リスト 。
text
インデックスのバージョン3も、発音区別符号のある文字では大文字と小文字を区別されません。 そのため、インデックスではé
、 É
、 e
、 E
の間も区別されません。
text
インデックスの以前のバージョンでは、発音区別符号付きの文字は別個の文字として扱われていました。
トークン化区切り文字
3text
トークン化に、バージョンDash
Hyphen
Pattern_Syntax
インデックスは、Quotation_Mark
Unicode の 、 、 、 、Terminal_Punctuation
、White_Space
8に分類される区切り文字を使用します。0 文字データベースのプロンプトリスト 。
たとえば、string "Il a dit qu'il «était le meilleur
joueur du monde»"
の場合、 text
インデックスは«
、 »
、スペースを区切り文字として扱います。
インデックスの以前のバージョンでは、 «
は用語"«était"
の一部として、 »
は用語"monde»"
の一部として扱われます。
インデックス エントリ
text
インデックスは、インデックスエントリのインデックス付きフィールドのタームをトークン化し、ステミングします。 text
インデックスでは、コレクション内の各ドキュメントの各インデックス付きフィールドに、一意の語幹付きタームごとに 1 つのインデックスエントリが保存されます。 インデックスは言語固有の単純な接尾辞ステミングを使用します。
サポートされている言語とストップワード
MongoDB はさまざまな言語のテキスト検索をサポートしています。 text
an
the
言語固有のストップワードand
例a
サポートされている言語のリストについては、「自己管理型配置のテキスト検索言語 」を参照してください。
none
の値に default_language
を指定すると、テキストインデックスはストップワードを含むフィールド内の各単語を解析し、接尾辞の語幹を無視します。
text
インデックスの言語を指定するには、「自己管理型配置のテキスト インデックスのデフォルト言語の指定」を参照してください。
sparse
プロパティ
text
インデックスは常にスパースで、スパースオプションを無視します。 ドキュメントにtext
インデックス フィールドがない場合(またはフィールドがnull
または空の配列である場合)、MongoDB はドキュメントのエントリーをtext
インデックスに追加しません。 挿入の場合、MongoDB はドキュメントを挿入しますが、 text
インデックスには追加しません。
text
インデックス キーと他のタイプのキーを含む複合インデックスの場合、インデックスがドキュメントを参照するかどうかは、 text
インデックス フィールドのみによって決定します。 その他のキーは、インデックスがドキュメントを参照するかどうかを決定しません。
制限事項
コレクションごとに 1 つのテキストインデックス
コレクションには最大1 つのtext
インデックスを含めることができます。
Atlas Search ( MongoDB Atlasで利用可能 )は、単一のコレクションに対して複数の全文検索インデックスをサポートします。 詳しくは、 Atlas Search のドキュメントを参照してください。
テキスト検索とヒント
クエリに$text
式が含まれている場合、 hint()
を使用してクエリに使用するインデックスを指定することはできません。
テキスト検索とフレーズ
$text
操作の $search
文字列にフレーズと個々のタームが含まれている場合、$text
はそのフレーズを含むドキュメントのみと一致します。
$text
演算子は複数のフレーズでは使えません。
テキストインデックスとソート
ソート操作では、複合テキスト インデックスであっても、 text
インデックスからはソート順序を取得できません。つまり、ソート操作では、テキスト インデックスで順序付けを使用できません。
複合インデックス
複合インデックスには、昇順または降順のインデックス キーと組み合わせてtext
インデックス キーを含めることができます。 ただし、これらの複合インデックスには次の制限があります。
複合
text
インデックスには、マルチキーや地理空間インデックス フィールドなどの他の特殊なインデックスタイプを含めることはできません。複合テキスト インデックスにテキスト インデックス キーの前にキーが含まれている場合、
$text
を使用するには、クエリ述語に先行するキーに対する等価一致条件が含まれている必要があります。複合
text
インデックスを作成する場合、すべてのtext
インデックス キーをインデックス仕様ドキュメントに連続して表示する必要があります。
その他の制限については、「テキスト インデックスとソート」も参照してください。
複合テキストインデックスの例については、「自己管理型配置でスキャンされたテキストインデックスエントリの制限 」を参照してください。
テキストインデックスの削除
text
インデックスを削除するには、インデックスの名前をdb.collection.dropIndex()
メソッドに渡します。 インデックスの名前を取得するには、 db.collection.getIndexes()
メソッドを実行します。
text
インデックスのデフォルトの命名スキームの詳細とデフォルト名の上書きについては、「 text
インデックスの名前の指定 」を参照してください。
照合オプション
text
インデックスは単純なバイナリ比較のみをサポートしており、照合 はサポートしていません。
単純ではない照合順序を持つコレクションにtext
インデックスを作成するには、インデックスの作成時、 {collation: {locale: "simple"}
}
を明示的に指定する必要があります。
ストレージ要件とパフォーマンスのコスト
text
インデックスには次のストレージ要件とパフォーマンスのコストがあります。
text
インデックスは大きくなる場合があります。 挿入された各ドキュメントの各インデックス付きフィールドには、それぞれ一意のステミング処理された単語ごとに 1 つのインデックスエントリが含まれます。text
インデックスの作成は、大規模な マルチキーインデックスの作成 と非常によく似ており、同じデータに対して単純な順序付き(スカラー)インデックスを作成するよりも時間がかかります。既存のコレクションに大規模な
text
インデックスを作成する場合は、オープンできるファイル記述子に十分な上限を設けるように確認します。 推奨設定 を参照してください。text
インデックスは挿入スループットに影響を与えます。これは、MongoDB が新しいソースドキュメントの各インデックス付きフィールドに、一意のステミング処理されたインデックスエントリを追加する必要があるためです。また、
text
インデックスでは、ドキュメント内のフレーズや単語の近接性に関する情報は保存しません。 その結果、コレクション全体が RAM に収まる方が、フレーズ クエリはより効率的に実行されます。
テキスト検索のサポート
text
インデックスは$text
クエリ操作をサポートしています。 テキスト検索の例については、 $text reference page
を参照してください。 集計パイプラインにおける$text
操作の例については、「自己管理型配置の集計パイプラインの $text 」を参照してください。