MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB:Cara melakukan pencarian teks dan mengurutkan berdasarkan tanggal

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Temukan perbedaan antara 2 dokumen di mongoDB dari mongo shell

  2. MongoDB 2.2 - Memperbarui Dokumen Bersarang Array

  3. Kerangka Entitas dan MongoDb

  4. File Dropzone tidak sepenuhnya diproses saat memanggil processFile(File)

  5. Rel regex mongoid pada bidang Integer