12/08/2018, 17:49

Rails mongoid full text search bằng gem mongoid_fulltext và mongoid_search

Cách mà google tìm kiếm từ câu truy vấn của người dùng, đó cũng là fulltext search, nhưng chắc rằng nó không đơn giản chỉ là fulltext search mà chắc phải có những sự tối ưu để đạt được tốc độ thần thánh như vậy (cái này thì mình chưa đủ trình độ để nhận biết được) Ở đây, mình chỉ xin giới ...

Cách mà google tìm kiếm từ câu truy vấn của người dùng, đó cũng là fulltext search, nhưng chắc rằng nó không đơn giản chỉ là fulltext search mà chắc phải có những sự tối ưu để đạt được tốc độ thần thánh như vậy (cái này thì mình chưa đủ trình độ để nhận biết được)

Ở đây, mình chỉ xin giới thiệu về fulltext trên engine mongodb. MongoDB cho phép đánh index cho text để hỗ trợ việc query bằng string. text indexes có thể là string hoặc array string. Collection (table đó) phải có text index. 1 collection chỉ có 1 text search index, nhưng trong nó có thể có nhiều trường, indexes chính là nhiều trường đó.

Ví dụ:

db.stores.createIndex( { field_1: "text", field_2: "text" } )

Sau khi tạo indexes xong thì có thể chạy lệnh sau để tìm kiếm:

db.stores.find( { text: { search: "keyword1 keyword2 keyword3" } } )

Mình có từng thấy qua câu hỏi:

Về Like! Chính xác thì Like chỉ trả về các kết quả có chứa keyword, phải chứa keyword thì mới trả về nhé.

Và nó còn là search theo từng field nữa, khai báo nhiều tốn công vãi, mà nhiều khi index còn không chạy đối với dạng like '%abc'. ( mặc dù với fulltext dể search thì còn phải tạo cả đống index và khai báo cũng tốn công hơn nhiều)

Nhưng lý do tại sao rất nhiều nơi vẫn dùng fulltext thay vì like ?

Mạo muội phát biểu like perfor cao hơn fulltext. Fulltext yêu cầu bộ nhớ lớn hơn nhiều cho việc đánh index, đến mức nhiều nhà cung cấp lưu trữ disable tính năng này hoặc bắt bạn trả phí để có thể sử dụng. Nhưng, giá trị đem lại, benefit của fulltext lại khiến nó đc sử dụng nhiều hơn.

Như ví dụ bên trên nếu bạn muốn tìm kiếm %abc thì like không tận dụng đc index và sẽ chậm hơn, nhưng fulltext thì có bởi bản thân việc tìm kiếm bằng fulltext đã là %abc% rồi (cách đánh index kiểu nhà giàu abcde thì đánh đến vài cái index tùy theo config: abc, bcd, cde). đây là cái khả năng break content của thằng fulltext. từ 1 cục data, theo config hoặc default settings nó sẽ break thành các từ theo word_separators hoặc theo độ rộng config (ví dụ là 3) thì nó tách content ra và đánh index và cả khi tìm kiếm để từ đó ta đưa ra được các gợi ý từ khi mà bạn nhập sai, nhập thiếu..

Tính năng "AI" của fulltext cũng đem lại lợi ích rất lớn khi nếu bạn tìm kiếm con chuột bằng tiếng anh -> bạn nhập mice like sẽ không bao giờ trả về thằng mouse nào đâu. Nhưng fulltext thì có. Dựa vào thư viện stem sử dụng nó sẽ tìm ra các từ kiểu đồng nghĩa để tìm kiếm. mice -> mouse hoặc computer, computing, computed. Bảo sao mà google nó đưa ra được kết quả gần giống với từ mình nhập vào.

Rank, sắp tới đợt review rank rồi             </div>
            
            <div class=

0