MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách tạo chỉ mục văn bản trong MongoDB

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ước text 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""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ữ.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDb qua jndi

  2. XFS vs EXT4 - So sánh Hiệu suất MongoDB trên AWS EC2

  3. Đặt thời gian chờ Mongo trong Spring Boot

  4. Làm cách nào để lưu trữ Máy chủ phân tích cú pháp của riêng tôi trên Heroku bằng MongoDB?

  5. Đếm các trường trong Bộ sưu tập MongoDB