Saat Anda membuat text
index di MongoDB, Anda memiliki opsi untuk menerapkan bobot yang berbeda untuk setiap bidang yang diindeks.
Bobot ini menunjukkan signifikansi relatif dari bidang yang diindeks satu sama lain. Bidang dengan bobot lebih tinggi akan lebih berdampak pada hasil penelusuran daripada bidang dengan bobot lebih rendah.
Ini memberi Anda sejumlah kontrol atas bagaimana hasil pencarian dihitung.
Bobot defaultnya adalah 1, jadi jika Anda tidak menentukan bobot untuk bidang, bobotnya akan diberi bobot 1.
Contoh
Misalkan kita memiliki koleksi yang disebut posts
, dan berisi dokumen seperti ini:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Kita bisa membuat text
gabungan indeks ke tiga bidang teks dan terapkan bobot yang berbeda untuk masing-masing bidang.
Seperti ini:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Ketika saya membuat senyawa text
index, saya menentukan 3 bidang. Ketika saya menentukan bobot, saya menentukan bobot hanya untuk dua bidang itu.
Hasilnya adalah kedua bidang tersebut akan diberi bobot seperti yang ditentukan, dan bidang lainnya (title
) akan memiliki bobot default 1.
Kita dapat melihat ini ketika kita menjalankan getIndexes()
:
db.posts.getIndexes()
Hasil:
[ { "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 } ]
Ini berarti bahwa body
bidang akan memiliki dua kali signifikansi abstract
bidang, dan sepuluh kali signifikansi title
lapangan.
Indeks Teks Karakter Pengganti dengan Bidang Berbobot
Anda dapat menerapkan bobot saat membuat indeks teks karakter pengganti. Indeks teks karakter pengganti dapat berguna saat Anda tidak tahu bidang teks apa yang akan ada di dokumen. Anda mungkin tahu beberapa , tapi tidak semua.
Dalam kasus seperti itu, Anda bisa membuat indeks teks karakter pengganti, dan menetapkan bobot ke bidang yang Anda ketahui. Bidang lainnya akan diberi nilai default 1.
Misalkan kita memiliki dokumen berikut sebagai pedoman:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Ini mirip dengan dokumen sebelumnya, kecuali sekarang memiliki tags
bidang yang berisi array. Tapi untuk semua yang kita tahu, dokumen masa depan dalam koleksi itu bisa memiliki bidang lain – seperti mungkin categories
, keywords
, author_bio
, dll.
Tapi kami tidak benar-benar tahu, jadi kami akan membuat indeks teks wildcard yang akan merangkum semua bidang dengan data string. Dan kami akan membuat pembobotan untuk beberapa bidang yang diketahui.
Contoh:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Dalam hal ini, body
bidang mendapat bobot 10
dan abstract
bidang mendapat bobot 5
. Ini berarti bahwa body
bidang memiliki dampak dua kali lipat dari bidang abstrak, dan sepuluh kali dampak dari semua bidang teks lainnya (karena akan diberi bobot default 1).
Setelah membuat indeks itu, jika kita memanggil getIndexes()
, kita dapat melihat bobot yang diberikan pada field:
db.posts.getIndexes()
Hasil:
[ { "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 } ]
Seperti yang diharapkan, body
bidang mendapat 10
, abstract
bidang mendapat 5
, dan yang lainnya mendapatkan 1
.