Ada berbagai jenis indeks yang dapat Anda buat di MongoDB. Jika Anda memiliki bidang yang berisi string atau larik string, Anda dapat menggunakan text
indeks di bidang itu.
Untuk membuat text
indeks, gunakan string literal "text"
sebagai nilai saat membuatnya.
Buat Indeks Teks pada Satu Bidang
Misalkan kita memiliki koleksi yang disebut posts
, dan berisi dokumen seperti ini:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Kita mungkin ingin membuat text
indeks pada body
bidang, atau abstract
bidang, atau bahkan keduanya.
Berikut cara membuat text
indeks pada body
bidang:
db.posts.createIndex( { body : "text" } )
Keluaran:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Sekarang kita dapat menggunakan getIndexes()
metode untuk melihat indeks:
db.posts.getIndexes()
Hasil:
[ { "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 } ]
Kita dapat melihat bahwa ada dua indeks. Yang pertama adalah _id
default indeks yang dibuat secara otomatis dengan koleksi. Indeks kedua adalah yang baru saja kita buat.
MongoDB telah secara otomatis menetapkan nama untuk indeks kami yang baru dibuat. Ini disebut body_text
.
Buat Indeks Teks Majemuk
Koleksi hanya dapat memiliki satu text
indeks, tetapi dapat berupa indeks gabungan jika diperlukan.
Mari kita buat indeks gabungan yang menyertakan body
bidang dan abstract
lapangan.
Seperti disebutkan, koleksi hanya dapat memiliki satu text
index, jadi lepaskan indeks yang baru saja kita buat:
db.posts.dropIndex("body_text")
Keluaran:
{ "nIndexesWas" : 2, "ok" : 1 }
Oke, sekarang kita telah menjatuhkan text
indeks, mari kita lanjutkan dan buat yang lain – kali ini akan menjadi indeks gabungan:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Keluaran:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Itu adalah pesan konfirmasi yang memberitahu kita bahwa dulu ada 1 indeks tapi sekarang ada 2.
Mari kita periksa kembali daftar indeks:
db.posts.getIndexes()
Hasil:
[ { "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 } ]
Perhatikan bahwa gabungan text
indeks memiliki batasan berikut:
- Gabungan
text
indeks tidak dapat menyertakan jenis indeks khusus lainnya, seperti bidang indeks multi-kunci atau geospasial. - Jika gabungan
text
indeks menyertakan kunci sebelumtext
kunci indeks, untuk melakukan$text
pencarian, predikat kueri harus menyertakan kondisi kecocokan kesetaraan pada kunci sebelumnya. - Saat membuat
text
gabungan indeks, semuatext
kunci indeks harus dicantumkan bersebelahan dalam dokumen spesifikasi indeks.
Buat Indeks Teks Wildcard
Anda dapat membuat indeks teks karakter pengganti dengan menggunakan karakter pengganti $**
pola bidang.
Mari lepaskan indeks sebelumnya dan buat indeks teks karakter pengganti:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB juga memberi kita kemampuan untuk membuat indeks wildcard, namun indeks teks wildcard dan indeks wildcard adalah dua hal yang berbeda.
Secara khusus, indeks teks karakter pengganti mendukung $text
operator, sedangkan indeks wildcard tidak.
weights
Parameter
Saat membuat text
indeks, Anda memiliki opsi untuk menentukan bobot pada satu atau beberapa bidang. Secara default, setiap bidang diberi bobot 1. Namun Anda dapat mengubahnya untuk memberi bobot lebih atau kurang pada bidang dalam hasil penelusuran.
Contoh
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Saya memulai dengan menghapus indeks sebelumnya.
Saat saya membuat text
baru 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()
lagi:
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.
Membuat Indeks Teks Beberapa Bahasa
Anda akan melihat bahwa text
di atas indeks termasuk "default_language" : "english"
dan "language_override" : "language"
dalam definisinya.
Bidang-bidang ini membantu menangani dokumen dalam berbagai bahasa. Nilai dalam indeks di atas adalah nilai default.
Saat Anda membuat dokumen, Anda dapat menentukan bahasa dokumen itu dengan menggunakan language
bidang (atau bidang lain yang ditentukan dalam language_override
bidang text
indeks). Jika bidang seperti itu tidak ada dalam dokumen, maka itu akan menggunakan bahasa default yang ditentukan dalam default_language
lapangan.
Anda dapat menentukan default_language
(dan language_override
) saat Anda membuat file index.
Lihat Membuat Indeks Teks Multi-Bahasa di MongoDB untuk contoh pembuatan indeks teks yang mendukung banyak bahasa.