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
を取得します 。