Tìm kiếm toàn văn MySQL mờ
Fuzzy Seach (tìm kiếm "mờ"), hay còn được gọi là Tìm kiếm gần đúng (tìm kiếm "xấp xẩm") là khái niệm chỉ dành cho kỹ thuật để tìm kiếm một xâu "gần giống" (thay vì "giống như") Show
Qua. Thắng Trần Đức Đây là câu mở đầu của bài viết Tìm kiếm mờ đơn giản Đọc đến đây chắc các bạn cũng biết rằng bài viết này mình sẽ viết về Tìm kiếm mờ. Tại lâu quá không viết bài nào nên mình cũng không biết nên mở đầu ra sao nữa. Mong các bạn thông cảm .Nếu bạn chưa biết về Fuzzy Seach có thể đọc bài viết ở link trên. Tuy không chắc chắn là đầy đủ nhưng vẫn giúp bất kỳ phần nào cho việc tìm hiểu. Trong bài viết này mình sẽ thử tự tạo Fuzzy Seach áp dụng thuật toán Khoảng cách Levenshtein với khoảng cách tối thiểu là 1 và sẽ kết hợp với tìm kiếm toàn văn để tìm kiếm đối tượng tương đối chính xác mà mình mong muốn thứ hai Open postKhi làm việc nhiều với Sql và gần đây là mysql mình tự hỏi một điều rằng
Chắc chắn các bạn biết rằng trong Sql có 1 chức năng là Công dụng của nó như sau
Giúp ta có thể sử dụng SOUNDEX kết hợp với tìm kiếm toàn văn một cách dễ dàng mình sẽ làm ví dụ trong một bài viết gần nhất .Nhưng đây chắc chắn không phải là những gì mình muốn chương trình của mình thực hiện. Mình muốn có một thuật toán thực sự tồn tại và nếu được thì kết hợp luôn cả Levenshtein. Qua tìm ngăn tủ thì mình thấy mysql không có những tính năng này mà muốn sử dụng thì ta phải sử dụng những máy chủ tìm kiếm khác như SOLR hoặc Elaticsearch. Việc sử dụng 1 chương trình tìm kiếm thứ 3 làm cho phần mềm không mát mẻ Nên mình quyết định tự tạo một phương pháp cho bản thân mình =)). Nếu bạn đã đọc bài viết về Fuzzy Seach của anh Thắng thì sẽ biết rằng trong PHP có 1 hàm mang tên levenshtein nhưng trong ngôn ngữ khác thì hoàn toàn không. Do vậy mình sẽ làm từ đầu đến hết tất cả các giai đoạn.Thân bàiB1. Khoảng cách Levenshtein là gì
Để hiểu thêm xin mời tham khảo ví dụ này. B2. Ý tưởng cho bài toánKhoảng cách tối thiểu là 1 ta sẽ sử dụng 3 phép biến đổi của Levenshtein để tạo ra những từ như sau. VD. Từ "Fuzzy", with a " _ " tương ứng là 1 ký tự hoặc cụm ký tự 1, Add an character2, Bớt một ký tự3, Change a characterDo đó tổng cộng ta có 16 cụm từ cần phải tìm kiếm để có kết quả chính xác nhất với mong muốn. Từ đây ta có thể viết được 1 câu truy vấn như sau
Khi nhìn số từ cần tìm ta có thể thấy ngay chúng ta cần (3 * n) + 1 từ so sánh (với n là độ dài của từ cần tìm). That is in the contract of ta use the distance of the minimum. Còn nếu gọi khoảng cách ta dùng là d thì ta phải có ít nhất là (3∗n)d(3 * n)^d(3∗n)d từ. Đó là một con số rất lớn, Từ đây mình nhận ra rằng việc mình đang làm thật sự là ngu ngơ và ngây thơ . Thôi kệ làm tiếp vậy.Từ câu Sql ở bên trên bạn thấy việc tìm kiếm này tổng quát hơn Chắc chắn việc chỉ sử dụng câu truy vấn thông thường như sau.
Làm sao để tạo ra một câu truy vấn dài ngoằng như trên Hãy cùng suy nghĩ nào.B3. Suy nghĩ tiếpChỗ này mình viết mã giả bằng js để hiển thị màu mè cho dễ nhìn .Ở B2 ta đã xác định câu hỏi cần tạo ra. Nhìn vào câu này ta có thể dễ dàng nghĩ đến giải pháp cộng chuỗi để tạo ra nó như sau
Đó là ta có 1 đoạn mã giả thật là. Đến đây nếu bạn để ý rằng ta đã có 1 thuật toán tìm kiếm và tự đánh chỉ mục cho dữ liệu rất chi là chất chứa trong Sql đó là Tìm kiếm toàn văn. Có thể tóm tắt là nếu bạn tìm kiếm 1 cụm từ bằng tìm kiếm toàn văn, thì nó sẽ sinh ra cho bạn 1 câu truy vấn tương tự như trên. Từ đây công việc của chúng ta dễ dàng hơn vài phần Biến mảng từ cần tìm thành 1 câu
Sau đó dùng full text search ta có 1 câu truy vấn như sau
Rằng từ đây bạn không cần phải suy nghĩ để viết ra câu truy vấn dài kia làm gì. Cái gì khó có thể sử dụng mấy cái có sẵn cho đời thêm vui .B 4. Viết hàm ngốc nghếch tạo ra cụm từ cần tìm kiếmĐây là bước mất công suy nghĩ nhất của bài viết này.
Xong Thế là mình đã tự tạo được 1 chức năng ngu ngốc để sử dụng. Và cuối cùng chúng ta cùng thử trải nghiệm chút nhé B5. play rung và đợi kết quảCheck tra data as any. Kết quả khi sử dụng hàm 4
Kết quả khi sử dụng Full text search Vâng. Kết quả đúng như mong muốn .Kết luậnMình không biết việc giành thời gian ra để suy nghĩ và tạo ra những vấn đề này mà không biết rằng có thực tế không. By mình thấy khi các bạn làm việc bất ngờ có một điều gì đó mới lạ trong nhiệm vụ thì việc đầu tiên chúng ta thường nghĩ xem có thư viện làm việc này không nhỉ ?.Nhiệm vụ bảo vệ thời gian ra để nghiên cứu tìm ra những vấn đề này có vẻ không thiết thực. Nhưng không sao vui vẻ với những cái mình đang làm là được rồi MySQL có hỗ trợ tìm kiếm toàn văn không?MySQL có hỗ trợ tìm kiếm và lập chỉ mục toàn văn bản . Chỉ mục toàn văn trong MySQL là chỉ mục kiểu FULLTEXT. Các chỉ mục toàn văn chỉ có thể được sử dụng với các bảng InnoDB hoặc MyISAM và chỉ có thể được tạo cho các cột CHAR , VARCHAR hoặc TEXT.
Làm cách nào để tìm kiếm tìm kiếm toàn văn trong MySQL?Để sử dụng tìm kiếm toàn văn bản trong MySQL, bạn cần phải sử dụng các chỉ mục toàn văn bản và hàm MATCH() . Chỉ mục toàn văn là FULLTEXT. Mysql hỗ trợ các chỉ mục toàn văn trên các bảng MyISAM. Hỗ trợ InnoDB đã được thêm vào kể từ phiên bản 5. 6.
Lợi thế của fulltext so với like để thực hiện tìm kiếm văn bản trong MySQL là gì?Sử dụng toán tử LIKE mang lại cho bạn độ chính xác 100% mà không phải nhượng bộ khi thu hồi. Công cụ tìm kiếm toàn văn cung cấp cho bạn rất nhiều sự linh hoạt để điều chỉnh độ chính xác để thu hồi tốt hơn . Hầu hết các triển khai tìm kiếm toàn văn đều sử dụng "chỉ mục đảo ngược".
Tìm kiếm mờ trong SQL là gì?Truy vấn tìm kiếm mờ tìm kiếm các chuỗi ký tự không chỉ giống nhau mà còn tương tự với cụm từ truy vấn . Sử dụng ký hiệu dấu ngã (~) ở cuối cụm từ để thực hiện tìm kiếm mờ. Ví dụ: truy vấn sau tìm các tài liệu bao gồm các thuật ngữ phân tích, phân tích, phân tích, v.v. |