"chỉ mục văn bản" và tìm kiếm thực sự có thể là lựa chọn tốt nhất ở đây miễn là bạn đang tìm kiếm toàn bộ từ.
Việc thêm chỉ mục văn bản vào định nghĩa giản đồ của bạn khá đơn giản:
BookSchema.index(
{
"name": "text",
"description": "text",
"body": "text"
},
{
"weights": {
"name": 5,
"description": 2
}
}
)
Điều này cho phép bạn thực hiện các tìm kiếm đơn giản với trọng số "đặt" cho các trường:
Book.find({ "$text": { "$search": "Holiday School Year" } })
.select({ "score": { "$meta": "textScore" } })
.sort({ "score": { "$meta": "textScore" } })
.exec(function(err,result) {
}
);
Trong đó mỗi thuật ngữ được so khớp sẽ được xem xét dựa trên trường mà nó được tìm thấy trong đó có trọng số và số lần xuất hiện nhiều nhất.
Việc gán trọng số được gắn với "chỉ mục", vì vậy định nghĩa được thực hiện một lần và không thể thay đổi. Một hạn chế khác là tại "tìm kiếm văn bản" không nhìn vào các từ "từng phần". Ví dụ:"ci" không khớp với "Thành phố" hoặc "Công dân" và đối với những thứ như vậy, bạn sẽ cần một biểu thức chính quy để thay thế.
Nếu bạn cần sự linh hoạt hơn mức đó hoặc nói chung phải có khả năng thay đổi trọng số của kết quả một cách linh hoạt thì bạn cần một cái gì đó như khung tổng hợp hoặc mapReduce.
Tuy nhiên, khung tổng hợp không thể thực hiện so khớp "logic" hoạt động (nó có thể lọc thông qua $match
nhưng không phải là đối sánh "logic") của "biểu thức chính quy" với các cụm từ của bạn. Tuy nhiên, bạn có thể làm việc với các từ đơn lẻ và kết hợp "chính xác" nếu điều này phù hợp.
Book.aggregate(
[
{ "$match": {
"$or": [
{ "name": /Holiday/ },
{ "description": /Holiday/ },
{ "body": /Holiday/ }
]
}},
{ "$project": {
"name": 1,
"description": 1,
"body": 1,
"score": {
"$add": [
{ "$cond": [{ "$eq": [ "$name", "Holiday" ] },5,0 ] },
{ "$cond": [{ "$eq": [ "$description", "Holiday" ] },2,0 ] },
{ "$cond": [{ "$eq": [ "$body", "Holiday" ] },1,0 ] }
]
}
}},
{ "$sort": { "score": -1 } }
],
function(err,results) {
}
)
Vì một đường ống tổng hợp sử dụng cấu trúc dữ liệu để truy vấn nơi bạn có thể thay đổi các tham số về trọng lượng trên mỗi lần xuất ra thành bất kỳ thứ gì bạn hiện đang cần.
MapReduce chia sẻ một nguyên tắc tương tự, trong đó bạn có thể bao gồm "điểm số" được tính toán vào một phần của khóa chính được phát ra làm phần tử hàng đầu. MapReduce sắp xếp tự nhiên tất cả đầu vào do phím này phát ra như một sự tối ưu hóa cho việc cung cấp cho một hàm giảm. Tuy nhiên, bạn không thể sắp xếp thêm hoặc "giới hạn" kết quả như vậy.
Đó thường là những lựa chọn để bạn xem xét và quyết định cái nào phù hợp nhất với trường hợp của mình.