MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB:Cách thực hiện tìm kiếm văn bản và sắp xếp theo ngày

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để đặt các tùy chọn tuần tự hóa cho các giá trị địa lý bằng cách sử dụng trình điều khiển 10gen C # chính thức?

  2. MongoDB Multikey Indexes &Index Intersection Bounds

  3. Gán kết quả trả về mongoose cho biến nút js

  4. Ánh xạ POJO hiệu quả đến / từ Java Mongo DBObject sử dụng Jackson

  5. mongoose stringify loại bỏ các phần tử trống