Có nhiều loại chỉ mục khác nhau mà bạn có thể tạo trong MongoDB. Nếu bạn có trường chứa một chuỗi hoặc một mảng chuỗi, bạn có thể sử dụng text
chỉ mục trên trường đó.
Để tạo một text
chỉ mục, sử dụng chuỗi ký tự "text"
như giá trị khi tạo nó.
Tạo chỉ mục văn bản trên một trường duy nhất
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 tôi có thể muốn tạo một text
chỉ mục trên body
trường hoặc abstract
trường, hoặc thậm chí cả hai.
Đây là cách tạo text
chỉ mục trên body
lĩnh vực:
db.posts.createIndex( { body : "text" } )
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Bây giờ chúng ta có thể sử dụng getIndexes()
phương pháp để xem chỉ mục:
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Chúng ta có thể thấy rằng có hai chỉ mục. Cái đầu tiên là _id
mặc định chỉ mục được tạo tự động với bộ sưu tập. Chỉ mục thứ hai là chỉ mục chúng tôi vừa tạo.
MongoDB đã tự động gán tên cho chỉ mục mới được tạo của chúng tôi. Nó được gọi là body_text
.
Tạo chỉ mục văn bản kết hợp
Một bộ sưu tập chỉ có thể có một text
chỉ mục, nhưng nó có thể là một chỉ mục kết hợp nếu được yêu cầu.
Hãy tạo một chỉ mục kết hợp bao gồm body
và trường abstract
trường.
Như đã đề cập, một bộ sưu tập chỉ có thể có một text
chỉ mục, vì vậy hãy bỏ chỉ mục chúng ta vừa tạo:
db.posts.dropIndex("body_text")
Đầu ra:
{ "nIndexesWas" : 2, "ok" : 1 }
Được rồi, bây giờ chúng ta đã bỏ text
chỉ mục, hãy tiếp tục và tạo một chỉ mục khác - lần này nó sẽ là một chỉ mục kết hợp:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Đó là thông báo xác nhận cho chúng ta biết rằng trước đây có 1 chỉ mục nhưng hiện tại có 2 chỉ mục.
Hãy kiểm tra lại danh sách các chỉ mục:
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Lưu ý rằng kết hợp text
chỉ mục có các hạn chế sau:
- Một
text
kết hợp chỉ mục không thể bao gồm bất kỳ loại chỉ mục đặc biệt nào khác, chẳng hạn như các trường chỉ mục đa khóa hoặc không gian địa lý. - Nếu kết hợp
text
chỉ mục bao gồm các khóa đứng trướctext
khóa chỉ mục, để thực hiện$text
tìm kiếm, vị từ truy vấn phải bao gồm các điều kiện khớp bình đẳng trên các khóa trước đó. - Khi tạo một
text
kết hợp chỉ mục, tất cảtext
các khóa chỉ mục phải được liệt kê liền kề trong tài liệu đặc tả chỉ mục.
Tạo chỉ mục văn bản ký tự đại diện
Bạn có thể tạo chỉ mục văn bản ký tự đại diện bằng cách sử dụng ký tự đại diện $**
trường mẫu.
Hãy bỏ chỉ mục trước đó và tạo chỉ mục văn bản ký tự đại diện:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB cũng cung cấp cho chúng tôi khả năng tạo chỉ mục ký tự đại diện, tuy nhiên chỉ mục văn bản ký tự đại diện và chỉ mục ký tự đại diện là hai thứ khác biệt.
Đặc biệt, các chỉ mục văn bản ký tự đại diện hỗ trợ $text
toán tử, trong khi chỉ mục ký tự đại diện thì không.
weights
Tham số
Khi tạo text
chỉ mục, bạn có tùy chọn chỉ định trọng số trên một hoặc nhiều trường. Theo mặc định, mỗi trường có trọng số là 1. Nhưng bạn có thể thay đổi điều này để cung cấp cho các trường trọng số nhiều hơn hoặc ít hơn trong kết quả tìm kiếm.
Ví dụ
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Tôi bắt đầu bằng cách bỏ chỉ mục trước đó.
Khi tôi tạo text
mới 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()
một lần nữa:
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.
Tạo chỉ mục văn bản nhiều ngôn ngữ
Bạn sẽ nhận thấy rằng text
ở trên chỉ mục bao gồm "default_language" : "english"
và "language_override" : "language"
trong định nghĩa của nó.
Các trường này hỗ trợ xử lý các tài liệu bằng nhiều ngôn ngữ. Các giá trị trong chỉ mục trên là giá trị mặc định.
Khi bạn tạo một tài liệu, bạn có thể chỉ định ngôn ngữ của tài liệu đó bằng cách sử dụng language
trường (hoặc một số trường khác được xác định trong language_override
trường của text
mục lục). Nếu trường như vậy không tồn tại trong tài liệu thì trường đó sẽ sử dụng ngôn ngữ mặc định được chỉ định trong default_language
trường.
Bạn có thể chỉ định một default_language
(và language_override
) khi bạn tạo chỉ mục.
Xem Tạo chỉ mục văn bản đa ngôn ngữ trong MongoDB để biết các ví dụ về cách tạo chỉ mục văn bản hỗ trợ nhiều ngôn ngữ.