MongoDBで作成できるインデックスにはさまざまな種類があります。文字列または文字列の配列を含むフィールドがある場合は、text
を使用できます。 そのフィールドのインデックス。
text
を作成するには インデックス、文字列リテラル"text"
を使用します 作成時の値として。
単一のフィールドにテキストインデックスを作成する
posts
というコレクションがあるとします。 、次のようなドキュメントが含まれています:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
text
を作成したい場合があります body
のインデックス フィールド、またはabstract
フィールド、またはその両方。
text
を作成する方法は次のとおりです body
のインデックス フィールド:
db.posts.createIndex( { body : "text" } )
出力:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
これで、getIndexes()
を使用できます インデックスを表示する方法:
db.posts.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
2つのインデックスがあることがわかります。最初のものはデフォルトの_id
です コレクションで自動的に作成されるインデックス。 2番目のインデックスは、先ほど作成したものです。
MongoDBは、新しく作成されたインデックスに名前を自動的に割り当てました。 body_text
と呼ばれます 。
複合テキストインデックスを作成する
コレクションに含めることができるtext
は1つだけです インデックスですが、必要に応じて複合インデックスにすることもできます。
body
を含む複合インデックスを作成しましょう フィールドとabstract
フィールド。
前述のように、コレクションには1つのtext
しか含めることができません インデックスなので、作成したばかりのインデックスを削除しましょう:
db.posts.dropIndex("body_text")
出力:
{ "nIndexesWas" : 2, "ok" : 1 }
OK、text
を削除しました インデックス、先に進んで別のインデックスを作成しましょう–今回は複合インデックスになります:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
出力:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
これは、以前は1つのインデックスがあったが、現在は2つあることを示す確認メッセージです。
インデックスのリストをもう一度確認しましょう:
db.posts.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
複合text
に注意してください インデックスには次の制限があります。
- 複合
text
インデックスには、マルチキーや地理空間インデックスフィールドなど、他の特別なインデックスタイプを含めることはできません。 - 複合
text
の場合 インデックスには、text
の前にあるキーが含まれます$text
を実行するためのインデックスキー 検索の場合、クエリ述語には、先行するキーの等価一致条件が含まれている必要があります。 - 複合
text
を作成する場合 インデックス、すべてのtext
インデックスキーは、インデックス仕様書に隣接して記載されている必要があります。
ワイルドカードテキストインデックスを作成する
ワイルドカード$**
を使用して、ワイルドカードテキストインデックスを作成できます。 フィールドパターン。
前のインデックスを削除して、ワイルドカードテキストインデックスを作成しましょう:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDBには、ワイルドカードインデックスを作成する機能もありますが、ワイルドカードテキストインデックスとワイルドカードインデックスは2つの異なるものです。
特に、ワイルドカードテキストインデックスは$text
をサポートします 演算子ですが、ワイルドカードインデックスはそうではありません。
weights
パラメータ
text
を作成する場合 インデックスでは、1つ以上のフィールドに重みを指定するオプションがあります。デフォルトでは、各フィールドに1の重みが与えられますが、検索結果でフィールドに多少の重みを与えるために、これを変更できます。
例
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
前のインデックスを削除することから始めました。
新しいtext
を作成したとき インデックス、3つのフィールドを指定しました。重みを指定したとき、それらのフィールドのうち2つだけに重みを指定しました。
その結果、これら2つのフィールドは指定どおりに重み付けされ、もう1つのフィールド(title
)が重み付けされます。 )デフォルトの重みは1になります。
getIndexes()
を実行するとこれを確認できます もう一度:
db.posts.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
これは、body
フィールドには、abstract
の2倍の意味があります フィールド、およびtitle
の10倍の重要性 フィールド。
複数言語のテキストインデックスの作成
上記のtext
インデックスには"default_language" : "english"
が含まれます および"language_override" : "language"
その定義で。
これらのフィールドは、複数の言語のドキュメントを処理するのに役立ちます。上記のインデックスの値はデフォルト値です。
ドキュメントを作成するときに、language
を使用してそのドキュメントの言語を指定できます。 フィールド(またはlanguage_override
で定義されている他のフィールド text
のフィールド 索引)。そのようなフィールドがドキュメントに存在しない場合は、default_language
で指定されたデフォルトの言語が使用されます フィールド。
default_language
を指定できます (およびlanguage_override
)インデックスを作成するとき。
複数の言語をサポートするテキストインデックスを作成する例については、MongoDBでの多言語テキストインデックスの作成を参照してください。