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での多言語テキストインデックスの作成を参照してください。