Terlepas dari kunci indeks gabungan lainnya, Anda harus menyertakan $meta
untuk "textScore" untuk mendapatkan penyortiran yang benar:
db.collection.find(
{ "$text": { "$search": "\"[email protected]\""}},
{ "score": { "$meta": "textScore" } }
).sort({
"score": { "$meta": "textScore" }, "Date": 1
})
Jadi tentu saja Anda ingin "skor" itu diurutkan terlebih dahulu, lalu menurut "Tanggal" agar hal-hal tersebut diberi peringkat yang benar berdasarkan relevansi pencarian.
Urutan indeks tidak masalah, tetapi tentu saja Anda hanya dapat memiliki indeks teks "satu". Jadi, pastikan Anda menghapus semua yang lain sebelum membuat:
db.collection.createIndex({
"From": "text",
"To": "text",
"CC":"text",
"BCC": "text",
"Date":1
})
Cari indeks yang terkini dengan:
db.collection.getIndicies()
Atau tinggalkan semuanya dan mulai baru:
db.collection.dropIndexes()
Untuk data yang tampaknya Anda cari, saya pikir indeks majemuk reguler di setiap bidang akan lebih cocok untuk Anda. Mencari alamat "email" harus "sama persis", dan jika Anda mengharapkan beberapa item untuk setiap bidang, maka mereka harus berupa larik string, seperti:
{
"TO": ["[email protected]"],
"FROM": ["[email protected]"],
"CC": ["[email protected]","[email protected]"],
"BCC": [],
"Date": ISODate("2015-07-27T13:42:05.535Z")
}
Maka Anda memerlukan indeks terpisah di setiap bidang, mungkin digabungkan dengan "Tanggal" seperti:
db.email.createIndex({ "TO": 1, "Date": 1 })
db.email.createIndex({ "FROM": 1, "Date": 1 })
db.email.createIndex({ "CC": 1, "Date": 1 })
db.email.createIndex({ "BCC": 1, "Date": 1 })
Dan kueri dengan $or
kondisi:
db.email.find({
"$or": [
{ "TO": "[email protected]" },
{ "FROM": "[email protected]" },
{ "CC": "[email protected]" },
{ "BCC": "[email protected]" }
],
"Date": { "$lt": new Date() }
})
Jika Anda melihat .explain(true)
(verbose) output dari itu, Anda akan melihat bahwa rencana yang menang adalah "persimpangan indeks" dari semua indeks yang ditentukan. Ini berhasil menjadi sangat efisien karena setiap bidang ( dan indeks yang dipilih ) memiliki nilai kecocokan yang tepat, dan kecocokan rentang pada tanggal yang diindeks.
Itu akan jauh lebih baik bagi Anda daripada "pencocokan kabur" dari pencarian teks. Bahkan ekspresi reguler harus bekerja lebih baik di sini secara umum ( untuk alamat email ) dan terutama jika "berlabuh" ^
ke awal string.
Indeks teks dimaksudkan agar "kata seperti token" cocok, tetapi ini tidak boleh menjadi data Anda. $or
tidak terlihat bagus, tetapi seharusnya melakukan pekerjaan yang jauh lebih baik.