Elaticsearch so với mongodb

Đầu tiên chúng ta thống nhất với nhau là hiểu khái niệm Tìm kiếm toàn văn là gì? . Tìm kiếm toàn văn đơn giản chỉ là một hình thức nâng cao việc tìm kiếm dữ liệu trong cơ sở dữ liệu mà thôi

Một số người bình thường họ có thể mất nhiều bước để tìm ra một chuỗi cần thiết thì dẫn đến công việc lâu và chậm, dẫn đến chùn bước. , nếu người đó biết được khái niệm và thực thi về Fulltext search thì việc đó trở nên đơn giản hơn bao giờ hết. Và bài viết này tôi sẽ hướng dẫn về điều đó với Mongodb

Tìm kiếm toàn văn Mongodb

Đương nhiên để hiểu về Tìm kiếm toàn văn trong mongodb thì trước tiên điều kiện quyết định là bạn đã cài đặt và sử dụng mongodb rồi đấy. Nếu bạn chưa biết thì có thể đi theo những hướng dẫn trong blog này đã viết hoặc có thể vào trang chủ của mongodb

  • Cách cài đặt và tạo người dùng quản lý cơ sở dữ liệu với mongodb
  • Cách kết nối mongodb với nodejs tốt nhất

Ok, coi như xong chúng ta sẽ đi tới chỗ thực thi. Đầu tiên giả sử bạn đã làm xong xuôi mọi chuyện và bạn sẽ chèn dữ liệu vào trong DB

> use test
switched to db test
> db.players.insertMany([
.. {"name": "cr7", "description": "ghi ban bang hai chan va bang dau"},
.. {"name": "m10", "description": "ghi ban chan trai va chan phai"},
.. {"name": "Haaland", "description": "ghi ban chan trai"},
.. {"name": "M3p", "description": "ghi ban chan phai"},
.. {"name": "greenwood", "description": "ghi ban bang dau"}
.. ])

Trên đó là tôi chèn một số cầu thủ đang hot với 2 tuyên bố.

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
0. Tôi nói nhanh thôi, đừng đi sâu vào chi tiết

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>

OK tìm kiếm xong, như vậy là chèn thành công. Tiếp đến sử dụng Tìm kiếm toàn văn bằng cách sử dụng

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
1. Trước khi khai báo chỉ mục, nếu không, bạn sẽ bị yêu cầu lập chỉ mục văn bản cho truy vấn $text như thế này

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>

Chúng ta khai báo chỉ mục như sau để sử dụng Tìm kiếm toàn văn trong Mongodb. Code as after

> db.players.createIndex({ "name": "text", "description": "text" });
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

OK, coi như xong về

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
2. Chúng ta chạy lại câu lệnh trên thì sẽ tìm thấy những tài liệu chứa giá trị tìm kiếm là
> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
3

________số 8

Giờ tìm kiếm

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
4 thì chung ta cũng nhận được hết 4 văn

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
0

Bởi vì khi chúng tôi tìm kiếm nó, nó sẽ tìm kiếm toàn văn bản cho nên nhận lệnh đối sánh các từ có trong cụm từ tìm kiếm trên.

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
5,
> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
6,
> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
7,
> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
8

Giờ chúng ta muôn đời chỉ tìm kiếm chính xác là

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
4 thôi thì chúng ta chỉ thấy
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
0 là có thể. Làm như sau

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
7

Chú ý dấu

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
1 là nó phân biệt chúng ta tìm không phải là
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
2 cho nên nó tìm kiếm cụm từ một cách chính xác

Tiếp theo, chúng ta chỉ tìm thấy các yêu cầu ghi bàn bằng cách bỏ đầu. Search as after

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
0

Chúng ta nhận thấy mục đích của chúng ta là sai bởi vì muốn tìm thủ thủ chỉ ghi bằng đầu thôi mà có tài liệu ghi bằng chân nữa. Chúng ta sẽ thay đổi như sau

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
1

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
3 chính là giá trị tìm kiếm mà chúng tôi không muốn tìm kiếm. Này hay khải thị không?

Ngoài ra còn có một tiện ích đó là khi chúng ta tìm kiếm thì chỉ muốn đánh giá đúng nhất, chẳng hạn như elaticsearch làm được. Lúc đó bạn sẽ sử dụng

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
4

> db.players.find()
{ "_id" : ObjectId("61e8def4cfc05da9225c6250"), "name" : "cr7", "description" : "ghi ban bang hai chan va bang dau" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6251"), "name" : "m10", "description" : "ghi ban chan trai va chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6252"), "name" : "Haaland", "description" : "ghi ban chan trai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6253"), "name" : "M3p", "description" : "ghi ban chan phai" }
{ "_id" : ObjectId("61e8def4cfc05da9225c6254"), "name" : "greenwood", "description" : "ghi ban bang dau" }
>
4

> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
5 sẽ có nhiệm vụ sắp xếp các cụm từ chính xác theo điểm số
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
6. Các bạn có thể nhìn lại như trên, tôi đã làm. Để ý thì thấy thứ tự lung tung cho nên chúng ta cần sắp xếp lại. Thì dùng
> db.players.find({ $text:{ $search: 'ghi ban'} })
Error: error: {
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27,
"codeName" : "IndexNotFound"
}
>
7 thôi

Tìm kiếm toàn văn MongoDB tiếng việt

Có một câu hỏi có nhiều bạn cũng thắc mắc về cách sử dụng Text search trong MongoDB về việc search search có dấu ở VN. Thì cơ bản nó cũng giống nhau cả thôi. Chủ yếu là khi bạn chèn dữ liệu như thế nào?