Làm cách nào để tìm chuỗi trong MongoDB?

MongoDB, một trong những cơ sở dữ liệu NoSQL hàng đầu, nổi tiếng với tốc độ nhanh, cấu trúc linh hoạt, khả năng mở rộng và khả năng lập chỉ mục tuyệt vời. Trước khi chúng ta đi vào chi tiết vụn vặt, hãy nhìn vào bức tranh lớn hơn. Khi nói đến việc định vị nội dung trên internet, tìm kiếm toàn văn là một chức năng bắt buộc phải có. Khi chúng tôi thấy tài liệu sử dụng các cụm từ hoặc từ khóa, minh họa tốt nhất là tìm kiếm trên Google. Trong bài đăng này, chúng ta sẽ tìm hiểu về khả năng tìm kiếm toàn văn của MongoDB dựa trên các chỉ mục văn bản

MongoDB đã ra mắt với một tính năng thử nghiệm cho phép Tìm kiếm Toàn văn thông qua Chỉ mục Văn bản trong phiên bản 2. 4. Tính năng này hiện là một yếu tố thiết yếu của sản phẩm (và không còn là tính năng thử nghiệm nữa). Trong bài đăng này, chúng ta sẽ tìm hiểu các nguyên tắc cơ bản về khả năng tìm kiếm toàn văn của MongoDB

Tìm kiếm văn bản - Một tính năng cần thiết

Hãy xem xét một tìm kiếm thông thường của Google để hiểu rõ hơn các khái niệm về tìm kiếm toàn văn. Khi chúng tôi sử dụng Google để tìm nội dung, chúng tôi nhập một chuỗi văn bản, chuỗi, cụm từ hoặc từ khóa và một số kết quả được trả về. Tìm kiếm toàn văn bản trong MongoDB cho phép bạn chạy các truy vấn phức tạp tương đương với các truy vấn bạn chạy bằng công cụ tìm kiếm. Bạn có thể tìm kiếm các cụm từ và các biến thể bắt nguồn từ một từ và bạn cũng có thể xóa các cụm từ "phủ định" cụ thể khỏi kết quả tìm kiếm của mình

Bạn có thể tạo một chỉ mục văn bản trên bất kỳ trường nào trong tài liệu có giá trị là một chuỗi hoặc một mảng chuỗi bằng tìm kiếm toàn văn MongoDB. Khi chúng tôi xây dựng một chỉ mục văn bản trên một trường, MongoDB mã hóa và tạo nội dung văn bản của trường được lập chỉ mục và tạo các chỉ mục tương ứng

Dưới đây là một số trường hợp khác mà chúng ta có thể thấy tìm kiếm toàn văn

  • Cân nhắc tìm kiếm Wiki cho chủ đề yêu thích của bạn. Khi bạn nhập cụm từ tìm kiếm trên Wiki, công cụ tìm kiếm sẽ trả về kết quả cho tất cả các bài viết có chứa từ khóa/cụm từ bạn đã nhập (ngay cả khi những từ khóa đó được sử dụng sâu bên trong bài viết). Mức độ liên quan của các kết quả tìm kiếm này được xác định bởi điểm số phù hợp của chúng.  
  • Hãy xem xét một trang mạng xã hội nơi người dùng có thể tiến hành tìm kiếm để tìm tất cả các bài đăng có chứa thuật ngữ mèo trong đó;

Thiết lập cho Tìm kiếm

Bây giờ chúng ta hãy xem xét một số ví dụ thực tế để giúp chúng ta hiểu mọi thứ tốt hơn. Tôi muốn bạn làm theo cùng với tôi bằng cách chạy các ví dụ trong vỏ mongo. Chúng tôi sẽ bắt đầu bằng cách tạo một số dữ liệu mẫu mà chúng tôi sẽ sử dụng trong suốt hướng dẫn và sau đó chúng tôi sẽ xem xét các ý tưởng chính

Để bắt đầu, hãy kết nối với máy chủ MongoDB của bạn.  

Khi bạn đã cài đặt MongoDB trên hệ thống của mình, bạn có thể sử dụng mongo shell để kết nối với máy chủ MongoDB

Chạy lệnh mongo từ dấu nhắc lệnh của bạn để khởi chạy MongoDB shell. Theo mặc định, lệnh mongo sẽ khởi chạy trình bao được liên kết với phiên bản MongoDB được cài đặt cục bộ chạy trên cổng 27017

Chạy lệnh mongo mà không cần thêm bất kỳ tham số nào

>mongo

Điều này sẽ tạo ra một thông báo chào mừng với thông tin về máy chủ mà trình bao được kết nối, cũng như phiên bản MongoDB được cài đặt

How To Use Mongodb Text Search?Xin chúc mừng, bạn đang ở trong vỏ mongo

Bây giờ hãy chạy các lệnh sau

>use message

Hãy sử dụng câu lệnh sau để chèn một số tài liệu

db.message.insert({"subject":"Ishan is having a dog", "content":"Dogs are most loyal pet", "likes": 60, "year":2015, "language":"english"})

db.message.insert({"subject":"Dogs eat cats", "content":"Cats are not evil", "likes": 30, "year":2015, "language":"english"})

db.message.insert({"subject":"Cats eat rats", "content":"Rats like cheese", "likes": 55, "year":2014, "language":"english"})

Tạo một chỉ mục

Để thực hiện tìm kiếm văn bản, trước tiên chúng ta phải thiết lập chỉ mục văn bản trên các trường. Điều này có thể được thực hiện trên một hoặc nhiều lĩnh vực. Câu lệnh bên dưới sẽ tạo chỉ mục văn bản trên một trường duy nhất

>db.message.createIndex({"subject":"text"})

Hãy sử dụng câu lệnh sau để chèn một số tài liệu

db.message.insert({"subject":"Ishan is having a dog", "content":"Dogs are most loyal pet", "likes": 60, "year":2015, "language":"english"})

db.message.insert({"subject":"Dogs eat cats", "content":"Cats are not evil", "likes": 30, "year":2015, "language":"english"})

db.message.insert({"subject":"Cats eat rats", "content":"Rats like cheese", "likes": 55, "year":2014, "language":"english"})

Tạo một chỉ mục

Để thực hiện tìm kiếm văn bản, trước tiên chúng ta phải thiết lập chỉ mục văn bản trên các trường. Điều này có thể được thực hiện trên một hoặc nhiều lĩnh vực. Câu lệnh bên dưới sẽ tạo chỉ mục văn bản trên một trường duy nhất

>db.message.createIndex({"subject":"text"})
How To Use Mongodb Text Search?Chúng tôi sẽ tạo chỉ mục văn bản dựa trên thuộc tính mô tả và phụ đề. Trong MongoDB, chúng ta chỉ có thể tạo một chỉ mục văn bản cho mỗi bộ sưu tập. Vì vậy, sử dụng dòng sau đây, chúng tôi sẽ thiết lập một chỉ mục văn bản phức hợp.
db.messages.createIndex({"subject":"text","content":"text"})

Sử dụng toán tử $text

Toán tử $text cũng có thể được sử dụng để tìm kiếm một chỉ mục văn bản. Toán tử này được sử dụng để thực hiện các thao tác tìm kiếm văn bản trên bộ sưu tập được lập chỉ mục văn bản. Toán tử này mã hóa từng chuỗi tìm kiếm bằng khoảng trắng và coi hầu hết các dấu chấm câu là dấu phân cách ngoại trừ – và \. " Nó thực hiện thao tác OR logic trên mã thông báo sau khi mã hóa cụm từ tìm kiếm. Sử dụng toán tử truy vấn $meta để sắp xếp các tài liệu đã tạo

Syntax: 
$text: 
{ 
     $search: , 
     $language: , 
     $caseSensitive: , 
     $diacriticSensitive:  
}

trường tìm kiếm $

Bây giờ chúng ta sẽ cố gắng tìm các tài liệu có từ khóa 'con chó' trong hộp chủ đề và nội dung. Chúng ta có thể sử dụng câu sau đây để thực hiện điều này

________số 8_______

Thí dụ

> db.message.find({$text: {$search: "dog"}},{ subject: 1, content:1}) 
This will give the output as:   
{ "_id" : ObjectId("6176ce6de02fd70a168ad9c6"), "subject" : "Ishan is having a dog", "content" : "Dogs are most loyal pet" } 
{ "_id" : ObjectId("6176ce77e02fd70a168ad9c7"), "subject" : "Dogs eat cats", "content" : "Cats are not evil" }

Sắp xếp tài liệu dựa trên mức độ liên quan của tìm kiếm

Điểm văn bản

Mỗi trang có cụm từ tìm kiếm trong các trường được lập chỉ mục sẽ nhận được điểm từ toán tử $text. Điểm cho biết mức độ liên quan của tài liệu đối với truy vấn tìm kiếm văn bản cụ thể. Điểm số có thể được chỉ định như một phần của định nghĩa phương thức sort() cũng như biểu thức phép chiếu. $meta. Biểu thức "textScore" cung cấp thông tin về quá trình xử lý hoạt động của $text. Để biết thêm thông tin về cách truy xuất điểm cho phép chiếu hoặc sắp xếp, hãy xem toán tử phép chiếu $meta MongoDB

Chúng tôi đang thực hiện tìm kiếm văn bản, vì vậy chúng tôi muốn nhận một số thống kê về mức độ phù hợp của các tài liệu kết quả. Để làm điều này, chúng tôi sẽ sử dụng $meta. Biểu thức "textScore", cung cấp thông tin về quá trình xử lý của toán tử $text. Sử dụng lệnh sắp xếp, chúng tôi cũng sẽ sắp xếp tài liệu theo textScore. Một textScore lớn hơn cho thấy một trận đấu tốt hơn

>use message
0

Truy vấn này trả về các tài liệu sau

>use message
1How To Use Mongodb Text Search?Như bạn có thể thấy, tài liệu đầu tiên được điểm 1. 2916666666666665 (vì từ khóa con chó xuất hiện hai lần trong chủ đề của nó), trong khi từ khóa thứ hai có số điểm là 1. Truy vấn cũng sắp xếp các tài liệu được trả về theo điểm số của chúng theo thứ tự giảm dần.

Lập chỉ mục hợp chất

Chúng tôi sẽ cho phép lập chỉ mục văn bản phức hợp trên các trường chủ đề và nội dung trong ví dụ của chúng tôi. Tiến hành chạy lệnh sau trong vỏ mongo

db.messages.createIndex({"subject":"text","content":"text"})
How To Use Mongodb Text Search?Lệnh này sẽ không hoạt động. Cố gắng tạo chỉ mục văn bản thứ hai sẽ dẫn đến thông báo lỗi cho biết đã tồn tại chỉ mục tìm kiếm toàn văn bản. Tại sao điều này là trường hợp? . Do đó, muốn lập mục lục văn bản khác thì phải xóa mục lục cũ và lập mục lục mới.
>use message
3

Sau khi chạy các truy vấn tạo chỉ mục được liệt kê ở trên, hãy thử tìm kiếm tất cả các trang bằng từ khóa cat

>use message
4

Truy vấn trên sẽ cho đầu ra sau

>use message
5

Lập chỉ mục toàn bộ tài liệu

Trong ví dụ trước, chúng tôi đã tạo một chỉ mục tổng hợp trên các trường chủ đề và nội dung. Tuy nhiên, có thể đôi khi bạn muốn bất kỳ nội dung văn bản nào trong bài báo của mình đều có thể tìm kiếm được

Ví dụ, xem xét lưu trữ email trong tài liệu MongoDB. Trong trường hợp email, tất cả các trường phải có thể tìm kiếm được, bao gồm Người gửi, Người nhận, Chủ đề và Nội dung. Trong những trường hợp như vậy, bạn có thể sử dụng trình xác định ký tự đại diện $** để lập chỉ mục tất cả các trường chuỗi của tài liệu của bạn

Truy vấn sẽ như sau (đảm bảo bạn xóa chỉ mục hiện có trước khi thiết lập chỉ mục mới)

>use message
6

Truy vấn này sẽ tạo các chỉ mục văn bản trên bất kỳ trường chuỗi nào trong tài liệu của chúng tôi

Thực hiện tìm kiếm văn bản trong một quy trình tổng hợp

Tìm kiếm văn bản được hỗ trợ trong quy trình tổng hợp thông qua toán tử truy vấn $text trong giai đoạn $match.  

Tuy nhiên, các quy định sau áp dụng cho tìm kiếm văn bản trong đường dẫn tổng hợp

  • Giai đoạn ban đầu của đường ống phải là giai đoạn $match với $text.  
  • Trong giai đoạn, toán tử $text chỉ có thể xuất hiện một lần.  
  • Biểu thức toán tử $text không được phép trong biểu thức $or hoặc $not.  
  • Theo mặc định, tìm kiếm văn bản không trả về các tài liệu phù hợp theo thứ tự điểm phù hợp. Sử dụng biểu thức tổng hợp $meta trong giai đoạn $sort để sắp xếp theo điểm số giảm dần

Toán tử $text gán điểm văn bản cho từng tài liệu chứa từ tìm kiếm trong trường chỉ mục. Điểm cho thấy tầm quan trọng của tài liệu liên quan đến truy vấn tìm kiếm văn bản nhất định

ví dụ.  

Các ví dụ sau dựa trên tuyển tập thư có chỉ mục văn bản trên chủ đề trường

>use message
7

Đếm số lượng tài liệu trong đó giá trị thú cưng là con chó

>use message
8

Đếm số lượng tài liệu có giá trị vật nuôi là Cat

>use message
8

Tóm lược

Nếu bạn xử lý nội dung chuỗi trong MongoDB, bạn nên sử dụng tìm kiếm toàn văn để tìm kiếm hiệu quả và chính xác hơn. Trong bài viết này, chúng tôi đã trình bày cách tiến hành tìm kiếm toàn văn cơ bản trên tập dữ liệu mẫu.  

Tìm kiếm toàn văn bản luôn là một trong những khả năng được yêu cầu nhiều nhất của MongoDB. Bài viết này bắt đầu với phần giới thiệu về tìm kiếm toàn văn bản trước khi chuyển sang các nguyên tắc cơ bản của việc tạo chỉ mục văn bản.  

Sau đó, chúng tôi đã xem xét lập chỉ mục phức hợp, lập chỉ mục ký tự đại diện. Chúng tôi cũng đã xem xét một số khái niệm chính bao gồm phân tích chỉ mục văn bản và tìm kiếm văn bản trong quy trình tổng hợp. Trong các phiên bản MongoDB sắp tới, chúng ta có thể mong đợi một số cải tiến đáng kể cho khả năng này

Làm cách nào để tìm kiếm một phần văn bản trong MongoDB?

Trong MongoDB, chúng ta có thể tìm kiếm văn bản bằng cách sử dụng toán tử truy vấn $text và toán tử này được sử dụng để thực hiện tìm kiếm văn bản trên một bộ sưu tập với . Nó 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 trên nội dung chuỗi.

Chuỗi trong MongoDB là gì?

Chuỗi kết nối MongoDB được định nghĩa là định dạng kết nối để tham gia máy chủ cơ sở dữ liệu MongoDB , chúng tôi sử dụng tên người dùng, tên máy chủ, mật khẩu và tham số cổng . Không có chuỗi kết nối thì không kết nối được với máy chủ cơ sở dữ liệu, chúng ta cần có chuỗi kết nối để kết nối máy chủ cơ sở dữ liệu.

Làm cách nào để tìm dữ liệu trong MongoDB?

Để chọn dữ liệu từ một bảng trong MongoDB, chúng ta cũng có thể sử dụng phương thức find() . Phương thức find() trả về tất cả các lần xuất hiện trong vùng chọn. Tham số đầu tiên của phương thức find() là một đối tượng truy vấn. Trong ví dụ này, chúng tôi sử dụng một đối tượng truy vấn trống để chọn tất cả các tài liệu trong bộ sưu tập.

Làm cách nào để lọc chuỗi trong MongoDB?

Bằng cách kết hợp việc sử dụng hàm LIKE với các ký tự đại diện , chúng ta có thể tìm thấy tất cả các giá trị bắt đầu, kết thúc hoặc chứa một chuỗi tại một vị trí nhất định. Các nhà phát triển đã từng làm việc với SQL Server rất quen thuộc với ký tự đại diện % đại diện cho 0 hoặc bất kỳ số lượng ký tự nào. Bạn có được ý tưởng.