MongoDB là một cơ sở dữ liệu NoSQL dựa trên tài liệu. Vì dữ liệu được lưu trữ ở định dạng của tài liệu nên nó có thể chứa một lượng dữ liệu khổng lồ và vì đây là loại cơ sở dữ liệu NoSQL nên không cần thiết phải có các mối quan hệ toàn vẹn tham chiếu. Vì vậy, tìm kiếm là một tiêu chí quan trọng ở đây và MongoDB cung cấp các chỉ mục Văn bản để hỗ trợ các truy vấn tìm kiếm văn bản, đặc biệt là trên nội dung chuỗi. Chỉ mục văn bản phải là một chuỗi hoặc một mảng các phần tử chuỗi
Làm cách nào để tạo mục lục văn bản?
Trong MongoDB, chúng ta có thể tạo các chỉ mục văn bản bằng cách sử dụng db. tên bộ sưu tập. phương thức tạo Index(). Vì vậy, để lập chỉ mục một trường chứa chuỗi hoặc một mảng các phần tử chuỗi, hãy chuyển một tài liệu trong phương thức createIndex() chứa trường và chuỗi ký tự (i. e. , "chữ"). Sử dụng phương pháp này, bạn được phép lập chỉ mục nhiều trường cho mục lục văn bản. Ngoài ra, một chỉ mục phức hợp có thể chứa khóa chỉ mục văn bản kết hợp với khóa chỉ mục tăng dần và giảm dần. Và nếu bạn muốn bỏ chỉ mục văn bản, chỉ cần sử dụng tên chỉ mục
cú pháp
db. tên bộ sưu tập. tạo Index( { trường. "chữ" } )
Thí dụ
cơ sở dữ liệu. gf
Bộ sưu tập. bài đăng của sinh viên
Các tài liệu. hai tài liệu
Bây giờ, chúng ta hãy tạo một chỉ mục văn bản trên trường “title” của bộ sưu tập “studentsposts” để tìm kiếm bên trong bộ sưu tập
db.studentsposts.createIndex({title: "text"})Bây giờ chúng ta sẽ xem cách tìm kiếm bằng Text Index
db.studentsposts.find({$text:{$search: "mongodb"}}).pretty()Đầu ra là tự giải thích ở trên vì chúng tôi đã tạo chỉ mục trên trường “tiêu đề” và chúng tôi đã cố gắng tìm kiếm văn bản “mongodb”. Nó hiện diện trong cả hai tài liệu trong trường "tiêu đề". Do đó, kết quả là 2 tài liệu ở đây
thả chỉ mục
Đôi khi cũng có thể cần phải xóa các chỉ mục văn bản vì nó được tạo sai hoặc cần sửa đổi theo một cách khác hoặc hoàn toàn muốn xóa nó. Vì vậy, sử dụng db. thu thập. dropIndex() chúng ta có thể xóa chỉ mục văn bản. Phương thức này xóa chỉ mục đã chỉ định khỏi bộ sưu tập đã cho
cú pháp
db.collection.dropIndex("TextIndex")Thí dụ
Đầu tiên, chúng ta tìm chỉ mục của trường
db.studentsposts.getIndexes()Bây giờ chúng tôi xóa chỉ mục văn bản bằng phương thức dropIndex()
db.studentsposts.dropIndex("title_text")Chỉ định trọng lượng
Đối với chỉ mục văn bản, trọng số của trường được lập chỉ mục là tầm quan trọng của trường. Trong MongoDB, đối với mỗi trường chỉ mục trong tài liệu, MongoDB tính tổng kết quả bằng cách nhân số lượng kết quả khớp với trọng số. Bây giờ sử dụng tổng này, MongoDB tính điểm cho tài liệu. Trọng số mặc định của trường chỉ mục là 1 và bạn có thể điều chỉnh trọng số của chỉ mục bằng phương thức createIndex()
Thí dụ
db.studentsposts.createIndex({title:"text", tags:"text"}, {weights:{title:10, tags:5}, name:"TextIndex"})Ở đây, trọng số của trường tiêu đề và thẻ là 10 và 5
chỉ mục ký tự đại diện
Sử dụng trình xác định ký tự đại diện ($**), bạn được phép tạo nhiều trường chỉ mục văn bản. Do chỉ mục văn bản ký tự đại diện MongoDB lập chỉ mục cho từng trường chứa dữ liệu chuỗi trong tất cả các tài liệu có trong bộ sưu tập đã cho. Chỉ mục văn bản ký tự đại diện hữu ích cho dữ liệu phi cấu trúc khi chúng tôi không biết trường nào chứa dữ liệu chuỗi hoặc cho truy vấn đặc biệt. Nó cho phép tìm kiếm văn bản trên tất cả các trường chứa dữ liệu chuỗi. Chỉ mục văn bản hoang dã có thể là một phần của chỉ mục ghép
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ó một trường chứa một chuỗi hoặc một mảng các chuỗi, bạn có thể sử dụng chỉ mục db.posts.createIndex( { body : "text" } )5 trên trường đó
Để tạo chỉ mục db.posts.createIndex( { body : "text" } )5, hãy sử dụng chuỗi ký tự db.posts.createIndex( { body : "text" } )7 làm giá trị khi tạo chỉ mục
Tạo một 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ó tên là db.posts.createIndex( { body : "text" } )8 và nó chứa các tài liệu như thế này
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }Chúng tôi có thể muốn tạo một chỉ mục db.posts.createIndex( { body : "text" } )5 trên trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }0 hoặc trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }1 hoặc thậm chí cả hai
Dưới đây là cách tạo chỉ mục db.posts.createIndex( { body : "text" } )5 trên trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }0
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 phương pháp { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }4 để 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ỉ số. Cái đầu tiên là chỉ mục { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }5 mặc định được tạo tự động với bộ sưu tập. Chỉ mục thứ hai là chỉ mục chúng ta 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à { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }6
Tạo một chỉ mục văn bản hợp chất
Một bộ sưu tập chỉ có thể có một chỉ mục db.posts.createIndex( { body : "text" } )5, nhưng nó có thể là chỉ mục tổng hợp nếu được yêu cầu
Hãy tạo một chỉ mục phức hợp bao gồm trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }0 và trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }1
Như đã đề cập, một bộ sưu tập chỉ có thể có một chỉ mục db.posts.createIndex( { body : "text" } )5, vì vậy hãy bỏ chỉ mục mà chúng ta vừa tạo
db.posts.dropIndex("body_text")đầu ra
{ "nIndexesWas" : 2, "ok" : 1 }OK, bây giờ chúng ta đã loại bỏ chỉ mục db.posts.createIndex( { body : "text" } )5, 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 tổng 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 tôi biết rằng đã từng 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ả
db.posts.createIndex( { body : "text" } )0Lưu ý rằng các chỉ số hợp chất db.posts.createIndex( { body : "text" } )5 có các hạn chế sau
- Chỉ mục tổng hợp db.posts.createIndex( { body : "text" } )5 không được bao gồm bất kỳ loại chỉ mục đặc biệt nào khác, chẳng hạn như trường chỉ mục nhiều khóa hoặc không gian địa lý
- Nếu chỉ mục phức hợp db.posts.createIndex( { body : "text" } )5 bao gồm các khóa đứng trước khóa chỉ mục db.posts.createIndex( { body : "text" } )5, để thực hiện tìm kiếm db.posts.getIndexes()6, vị từ truy vấn phải bao gồm điều kiện so khớp đẳng thức trên các khóa trước đó
- Khi tạo chỉ mục phức hợp db.posts.createIndex( { body : "text" } )5, tất cả khóa chỉ mục db.posts.createIndex( { body : "text" } )5 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 mẫu trường ký tự đại diện db.posts.getIndexes()9
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.createIndex( { body : "text" } )1MongoDB cũng cung cấp cho chúng ta khả năng tạo các 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ụ thể, chỉ mục văn bản ký tự đại diện hỗ trợ toán tử db.posts.getIndexes()6, trong khi chỉ mục ký tự đại diện thì không
Thông số [ { "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 } ]1
Khi tạo db.posts.createIndex( { body : "text" } )5 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 gán trọng số là 1. Nhưng bạn có thể thay đổi điều này để tăng hoặc giảm trọng số cho các trường trong kết quả tìm kiếm
Thí dụ
db.posts.createIndex( { body : "text" } )2Tôi đã bắt đầu bằng cách bỏ chỉ mục trước đó
Khi tôi tạo chỉ mục db.posts.createIndex( { body : "text" } )5 mới, 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 ([ { "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 } ]4) sẽ có trọng số mặc định là 1
Chúng ta có thể thấy điều này khi chúng ta chạy lại [ { "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 } ]5
db.posts.getIndexes()Kết quả
db.posts.createIndex( { body : "text" } )4Điều này có nghĩa là trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }0 sẽ có ý nghĩa gấp đôi trường { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }1 và gấp mười lần ý nghĩa của trường [ { "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 } ]4
Tạo nhiều chỉ mục văn bản ngôn ngữ
Bạn sẽ nhận thấy rằng chỉ số db.posts.createIndex( { body : "text" } )5 ở trên bao gồm db.posts.dropIndex("body_text")0 và db.posts.dropIndex("body_text")1 trong định nghĩa của nó
Các trường này hỗ trợ xử lý tài liệu bằng nhiều ngôn ngữ. Các giá trị trong chỉ mục trên là các 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 trường db.posts.dropIndex("body_text")2 (hoặc một số trường khác được xác định trong trường db.posts.dropIndex("body_text")3 của chỉ mục db.posts.createIndex( { body : "text" } )5). Nếu trường đó không tồn tại trong tài liệu thì nó sẽ sử dụng ngôn ngữ mặc định được chỉ định trong trường db.posts.dropIndex("body_text")5
Bạn có thể chỉ định db.posts.dropIndex("body_text")5 (và db.posts.dropIndex("body_text")3) khi tạo chỉ mục
Xem Tạo chỉ mục văn bản đa ngôn ngữ trong MongoDB để biết ví dụ về cách tạo chỉ mục văn bản hỗ trợ nhiều ngôn ngữ