textを作成するとき MongoDBのインデックスでは、インデックス付けされた各フィールドに異なる重みを適用するオプションがあります。
これらの重みは、インデックス付きフィールドの相互の相対的な重要性を示します。重みが大きいフィールドは、重みが小さいフィールドよりも検索結果に大きな影響を与えます。
これにより、検索結果の計算方法をある程度制御できます。
デフォルトの重みは1であるため、フィールドに重みを指定しない場合、重み1が割り当てられます。
例
postsというコレクションがあるとします。 、次のようなドキュメントが含まれています:
{
"_id" : 1,
"title" : "The Web",
"body" : "Body text...",
"abstract" : "Abstract text..."
}
複合textを作成できます 3つのテキストフィールドにインデックスを付け、それぞれに異なる重みを適用します。
このように:
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倍の重要性 フィールド。
加重フィールドを使用したワイルドカードテキストインデックス
ワイルドカードテキストインデックスを作成するときに重みを適用できます。ワイルドカードテキストインデックスは、ドキュメント内のテキストフィールドが何になるかわからない場合に便利です。あなたはいくつかを知っているかもしれません 、すべてではありません。
このような場合、ワイルドカードテキストインデックスを作成し、認識しているフィールドに重みを割り当てることができます。その他のフィールドには、デフォルト値の1が割り当てられます。
ガイドラインとして次のドキュメントがあるとします。
{
"_id" : 1,
"title" : "Title text...",
"body" : "Body text...",
"abstract" : "Abstract text...",
"tags" : [
"tag1",
"tag2",
"tag3"
]
}
以前のドキュメントと似ていますが、tagsが追加されている点が異なります。 配列を含むフィールド。しかし、私たちが知っている限りでは、そのコレクションの将来のドキュメントには、categoriesなどの他のフィールドが含まれる可能性があります。 、keywords 、author_bio 、など。
ただし、実際にはわからないため、すべてのフィールドを文字列データでカプセル化するワイルドカードテキストインデックスを作成します。また、既知のフィールドのいくつかに重みを作成します。
例:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
この場合、body フィールドの重みは10になります およびabstract フィールドは5の重みを取得します 。これは、body フィールドには、抽象フィールドの2倍の影響があり、他のすべてのテキストフィールドの10倍の影響があります(デフォルトの重み1が割り当てられるため)。
そのインデックスを作成した後、getIndexes()を呼び出すと 、フィールドに与えられた重みを確認できます:
db.posts.getIndexes() 結果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "$**_text",
"weights" : {
"$**" : 1,
"abstract" : 5,
"body" : 10
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]
予想通り、body フィールドは10を取得します 、abstract フィールドは5を取得します 、および他のすべては1を取得します 。