MongoDB cung cấp cho chúng tôi khả năng 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 tương tự như chỉ mục ký tự đại diện, ngoại trừ chỉ mục văn bản ký tự đại diện hỗ trợ $text
toán tử, trong khi các chỉ mục ký tự đại diện thì không.
Điều đó nói rằng, việc tạo mỗi loại chỉ mục rất giống nhau theo nghĩa là cả hai đều dùng chung ký tự đại diện $**
trường mẫu.
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 giống như sau:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Chúng tôi có thể tạo chỉ mục văn bản ký tự đại diện trên bộ sưu tập đó như sau:
db.posts.createIndex( { "$**": "text" } )
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Điều đó sử dụng ký tự đại diện $**
trường mẫu để tạo chỉ mục trên tất cả các trường văn bản. Khi bạn tạo một chỉ mục như thế này, MongoDB lập chỉ mục mọi trường có chứa dữ liệu chuỗi cho mỗi tài liệu trong bộ sưu tập.
Làm điều này có thể hữu ích nếu bộ sưu tập chứa nhiều nội dung không có cấu trúc và không có sự nhất quán của các trường văn bản trong tài liệu. Trong những trường hợp như vậy, bạn sẽ không thể đưa các trường vào chỉ mục một cách rõ ràng vì bạn sẽ không biết trường nào sẽ có trong tài liệu.
Trường có trọng số
Bạn có thể sử dụng weights
để gán các trọng số khác nhau cho các trường trong chỉ mục văn bản ký tự đại diện.
Ví dụ:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
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()
để trả về tất cả các chỉ mục cho tập hợp, 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
.