Có thể lập chỉ mục văn bản với MongoDB không?

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

Có thể lập chỉ mục văn bản với MongoDB không?

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"})

Có thể lập chỉ mục văn bản với MongoDB không?

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()

Có thể lập chỉ mục văn bản với MongoDB không?

Đầ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()

Có thể lập chỉ mục văn bản với MongoDB không?

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")

Có thể lập chỉ mục văn bản với MongoDB không?

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

Có thể lập chỉ mục văn bản với MongoDB không?

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" } )
0

Lư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" } )
1

MongoDB 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" } )
2

Tô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ữ

Có thể lập chỉ mục trong MongoDB không?

MongoDB sử dụng chỉ mục đa khóa để lập chỉ mục nội dung được lưu trữ trong mảng . Nếu bạn lập chỉ mục cho một trường chứa giá trị mảng, MongoDB sẽ tạo các mục nhập chỉ mục riêng cho mọi phần tử của mảng. Các chỉ mục đa khóa này cho phép các truy vấn chọn tài liệu có chứa mảng bằng cách so khớp trên phần tử hoặc các phần tử của mảng.

Làm cách nào để tạo chỉ mục văn bản trong MongoDB Compass?

Để tạo chỉ mục trên bộ sưu tập qua Compass, bộ sưu tập phải chứa tài liệu. .
Nhấp vào nút Tạo chỉ mục. Từ tab Chỉ mục, nhấp vào nút Tạo Chỉ mục để hiển thị hộp thoại Tạo Chỉ mục
Không bắt buộc. Nhập tên chỉ mục. .
Thêm trường vào chỉ mục. Chỉ định một khóa chỉ mục

Làm cách nào để sử dụng tìm kiếm văn bản trong MongoDB?

Sử dụng toán tử truy vấn $text để thực hiện tìm kiếm văn bản trên bộ sưu tập có chỉ mục văn bản . $text sẽ mã hóa chuỗi tìm kiếm bằng cách sử dụng khoảng trắng và hầu hết các dấu chấm câu làm dấu phân cách và thực hiện OR logic của tất cả các mã thông báo như vậy trong chuỗi tìm kiếm.

Làm cách nào để tạo chỉ mục văn bản trong MongoDB Nodejs?

Theo mặc định, MongoDB tạo một chỉ mục duy nhất trên trường _id trong quá trình tạo bộ sưu tập. Để tạo một chỉ mục duy nhất, chỉ định trường hoặc tổ hợp các trường mà bạn muốn ngăn trùng lặp và đặt tùy chọn duy nhất thành true .