Khi bạn tạo một text
chỉ mục trong MongoDB, bạn có tùy chọn áp dụng các trọng số khác nhau cho từng trường được lập chỉ mục.
Các trọng số này biểu thị tầm quan trọng tương đối của các trường được lập chỉ mục đối với nhau. Trường có tỷ trọng cao hơn sẽ có nhiều tác động hơn trong kết quả tìm kiếm so với trường có tỷ trọng thấp hơn.
Điều này cung cấp cho bạn một lượng kiểm soát nhất định đối với cách tính kết quả tìm kiếm.
Trọng lượng mặc định là 1, vì vậy nếu bạn không chỉ định trọng số cho trường, thì trường đó sẽ được gán trọng số là 1.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là posts
và nó chứa các tài liệu như sau:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Chúng ta có thể tạo một text
kết hợp lập chỉ mục cho ba trường văn bản và áp dụng các trọng số khác nhau cho mỗi trường.
Như thế này:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Khi tôi tạo kết hợp text
chỉ mục, tôi đã chỉ định 3 trường. Khi tôi chỉ định trọng số, tôi đã chỉ định trọng số cho chỉ hai trong số các trường đó.
Kết quả là hai trường đó sẽ có trọng số như đã chỉ định và trường còn lại (title
) sẽ có trọng lượng mặc định là 1.
Chúng ta có thể thấy điều này khi chạy getIndexes()
:
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Điều này có nghĩa là body
trường sẽ có ý nghĩa gấp đôi trường abstract
và tầm quan trọng của title
gấp mười lần trường.
Chỉ mục văn bản ký tự đại diện với các trường có trọng số
Bạn có thể áp dụng trọng số khi tạo chỉ mục văn bản ký tự đại diện. Chỉ mục văn bản ký tự đại diện có thể hữu ích khi bạn không biết các trường văn bản sẽ có trong tài liệu. Bạn có thể biết một số , nhưng không phải tất cả.
Trong những trường hợp như vậy, bạn có thể tạo chỉ mục văn bản ký tự đại diện và gán trọng số cho những trường mà bạn biết. Mọi trường khác sẽ được gán giá trị mặc định là 1.
Giả sử chúng ta có tài liệu sau làm kim chỉ nam:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Nó tương tự như tài liệu trước, ngoại trừ việc nó hiện có thẻ tags
trường có chứa một mảng. Nhưng đối với tất cả những gì chúng ta biết, các tài liệu trong tương lai trong bộ sưu tập đó có thể có các trường khác - chẳng hạn như categories
, keywords
, author_bio
, v.v.
Nhưng chúng tôi thực sự không biết, vì vậy chúng tôi sẽ tạo một chỉ mục văn bản ký tự đại diện sẽ đóng gói tất cả các trường bằng dữ liệu chuỗi. Và chúng tôi sẽ tạo trọng số cho một số trường đã biết.
Ví dụ:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Trong trường hợp này, body
trường có trọng số là 10
và abstract
trường có trọng số là 5
. Điều này có nghĩa là body
trường có tác động gấp đôi trường trừu tượng và tác động gấp mười lần đối với tất cả các trường văn bản khác (vì chúng sẽ được gán trọng số mặc định là 1).
Sau khi tạo chỉ mục đó, nếu chúng ta gọi getIndexes()
, chúng ta có thể thấy các trọng số được cung cấp cho các trường:
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "$**_text", "weights" : { "$**" : 1, "abstract" : 5, "body" : 10 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Như mong đợi, body
trường nhận được 10
, abstract
trường nhận được 5
và tất cả những người khác nhận được 1
.