Bất kể khóa chỉ mục ghép nào khác, bạn cần bao gồm $ meta
cho "textScore" để có được sự sắp xếp chính xác:
db.collection.find(
{ "$text": { "$search": "\"[email protected]\""}},
{ "score": { "$meta": "textScore" } }
).sort({
"score": { "$meta": "textScore" }, "Date": 1
})
Vì vậy, tự nhiên bạn muốn "điểm" đó được sắp xếp đầu tiên, sau đó là "Ngày" để mọi thứ được xếp hạng chính xác theo mức độ liên quan của tìm kiếm.
Thứ tự của chỉ mục không quan trọng, nhưng tất nhiên bạn có thể có "một" chỉ mục văn bản. Vì vậy, hãy đảm bảo rằng bạn bỏ tất cả những người khác trước khi tạo:
db.collection.createIndex({
"From": "text",
"To": "text",
"CC":"text",
"BCC": "text",
"Date":1
})
Tìm kiếm các chỉ mục hiện tại với:
db.collection.getIndicies()
Hoặc chỉ cần bỏ mọi thứ và bắt đầu lại:
db.collection.dropIndexes()
Mặc dù vậy, đối với dữ liệu bạn đang tìm kiếm, tôi sẽ nghĩ rằng một chỉ mục kết hợp thông thường trên mỗi trường sẽ phù hợp với bạn hơn. Tìm kiếm địa chỉ "email" phải là một "đối sánh chính xác" và nếu bạn mong đợi nhiều mục cho mỗi trường thì chúng phải là các mảng chuỗi, như vậy:
{
"TO": ["[email protected]"],
"FROM": ["[email protected]"],
"CC": ["[email protected]","[email protected]"],
"BCC": [],
"Date": ISODate("2015-07-27T13:42:05.535Z")
}
Sau đó, bạn cần các chỉ mục riêng biệt trên mỗi trường, có thể ghép với "Ngày" như sau:
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 })
Và truy vấn bằng $ hoặc
điều kiện:
db.email.find({
"$or": [
{ "TO": "[email protected]" },
{ "FROM": "[email protected]" },
{ "CC": "[email protected]" },
{ "BCC": "[email protected]" }
],
"Date": { "$lt": new Date() }
})
Nếu bạn nhìn vào mã .explain (true) >
(dài dòng) từ đó, bạn sẽ thấy rằng kế hoạch chiến thắng là một "giao điểm chỉ số" của tất cả các chỉ mục được chỉ định. Điều này hoạt động rất hiệu quả vì mọi trường (và chỉ mục được chọn) đều có giá trị đối sánh chính xác và đối sánh phạm vi vào ngày được lập chỉ mục.
Điều đó sẽ tốt hơn cho bạn rất nhiều so với "kết hợp mờ" của các tìm kiếm văn bản. Ngay cả biểu thức chính quy cũng sẽ hoạt động tốt hơn ở đây nói chung (đối với địa chỉ e-mail) và đặc biệt nếu chúng được "neo" ^
đến đầu chuỗi.
Chỉ mục văn bản có nghĩa là "mã thông báo từ giống như" đối sánh, nhưng đây không phải là dữ liệu của bạn. $ hoặc
trông không đẹp, nhưng nó sẽ hoạt động tốt hơn nhiều.