Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tìm kiếm toàn văn bản trong MySQL:Tốt, xấu và xấu

Đôi khi khi tìm kiếm trong cơ sở dữ liệu MySQL, bạn có thể muốn chạy các truy vấn tìm kiếm toàn văn bản dựa trên dữ liệu dựa trên ký tự. Hôm nay chúng ta sẽ thảo luận về những ưu điểm và nhược điểm của các phương pháp tìm kiếm như vậy.

Tìm kiếm Toàn văn trong MySQL là gì?

Tìm kiếm toàn văn là một kỹ thuật cho phép bạn tìm kiếm các bản ghi có thể không hoàn toàn phù hợp với tiêu chí tìm kiếm. Tìm kiếm toàn văn bản trong MySQL được thực hiện khi các chỉ mục nhất định đang được sử dụng và các chỉ mục đó có nhiều sắc thái độc đáo bao gồm những điều sau:

  • Để chỉ mục được coi là chỉ mục toàn văn, chỉ mục phải thuộc loại FULLTEXT.
  • Chỉ có thể sử dụng chỉ mục FULLTEXT trên các bảng chạy công cụ lưu trữ InnoDB hoặc MyISAM.
  • Chỉ có thể tạo chỉ mục FULLTEXT cho các cột CHAR, VARCHAR hoặc TEXT.
  • Chỉ mục FULLTEXT chỉ được sử dụng khi mệnh đề MATCH () AGAINST () được sử dụng.
  • Tìm kiếm toàn văn có ba chế độ:chế độ ngôn ngữ tự nhiên, chế độ boolean và chế độ mở rộng truy vấn.

Chỉ mục FULLTEXT là một loại chỉ mục đặc biệt dùng để tìm các từ khóa trong văn bản thay vì so sánh các giá trị với các giá trị trong chỉ mục. Mặc dù tìm kiếm FULLTEXT khác với các loại đối sánh khác, xin lưu ý rằng bạn có thể có chỉ mục BTREE và chỉ mục FULLTEXT trên cùng một cột tại cùng một thời điểm - chúng sẽ không xung đột vì chúng phù hợp cho các mục đích khác nhau.

Loại Tìm kiếm Toàn Văn bản

Khi chạy tìm kiếm toàn văn bản trong MySQL, hãy nhớ rằng có ba kiểu tìm kiếm để lựa chọn:

  1. Loại tìm kiếm theo ngôn ngữ tự nhiên - chế độ tìm kiếm như vậy diễn giải chuỗi tìm kiếm dưới dạng một cụm từ theo nghĩa đen. Được bật theo mặc định nếu không có công cụ sửa đổi nào được chỉ định hoặc khi công cụ sửa đổi CHẾ ĐỘ NGÔN NGỮ TỰ NHIÊN được chỉ định;
  2. Loại tìm kiếm mở rộng truy vấn - chế độ tìm kiếm như vậy thực hiện tìm kiếm hai lần. Khi tìm kiếm lần thứ hai, tập hợp kết quả bao gồm một vài tài liệu phù hợp nhất từ ​​lần tìm kiếm đầu tiên. Được bật bằng cách sử dụng công cụ sửa đổi VỚI MỞ RỘNG QUERY;
  3. Loại tìm kiếm boolean - chế độ tìm kiếm như vậy cho phép tìm kiếm các truy vấn phức tạp có thể bao gồm toán tử boolean như toán tử less than (“<”) và nhiều hơn (“>”), subexpressions (“( ”Và“) ”), dấu cộng (+), dấu trừ (-), dấu ngoặc kép (“ ”), toán tử làm giảm mức đóng góp của giá trị vào kết quả (~) và toán tử ký tự đại diện (*) - toán tử ký tự đại diện cho phép tìm kiếm với đối sánh mờ (ví dụ:“demo *” cũng sẽ khớp với “trình diễn”). Đã bật bằng công cụ sửa đổi IN BOOLEAN MODE.

Tìm kiếm Toàn văn với Chế độ Tìm kiếm Ngôn ngữ Tự nhiên

Chế độ tìm kiếm ngôn ngữ tự nhiên, như đã lưu ý ở trên, được bật theo mặc định hoặc khi công cụ sửa đổi IN NATURAL LANGUAGE MODE được chỉ định. Chế độ này thực hiện tìm kiếm ngôn ngữ tự nhiên dựa trên một tập hợp văn bản nhất định (một hoặc nhiều cột). Định dạng truy vấn cơ bản của các tìm kiếm toàn văn trong MySQL phải tương tự như sau:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Khi MATCH () được sử dụng cùng với mệnh đề WHERE, các hàng sẽ tự động được sắp xếp theo mức độ liên quan cao nhất trước tiên. Để tìm kiếm một chuỗi chính xác, hãy đặt nó bằng dấu ngoặc kép.

Tìm kiếm Toàn văn với Chế độ Mở rộng Truy vấn

Tìm kiếm toàn văn bản cũng hỗ trợ chế độ mở rộng truy vấn. Chế độ tìm kiếm như vậy thường được sử dụng khi người dùng dựa vào kiến ​​thức ngụ ý - ví dụ:người dùng có thể tìm kiếm “DBMS” với hy vọng thấy cả “MongoDB” và “MySQL” trong kết quả tìm kiếm. Lý do tại sao người dùng có thể dựa vào một số kiến ​​thức ngụ ý khi sử dụng chế độ tìm kiếm như vậy khá đơn giản - tìm kiếm toàn văn với chế độ mở rộng truy vấn hoạt động bằng cách thực hiện tìm kiếm hai lần:cụm từ tìm kiếm thứ hai là cụm từ tìm kiếm đầu tiên được nối với một vài mục có liên quan nhất từ ​​lần tìm kiếm đầu tiên. Điều đó có nghĩa là, ví dụ:nếu trong lần tìm kiếm đầu tiên một trong các hàng chứa từ “DBMS” và từ “MySQL”, thì lần tìm kiếm thứ hai sẽ tìm các mục nhập bao gồm từ “MySQL” ngay cả khi chúng không chứa “DBMS”. Định dạng truy vấn sử dụng chế độ mở rộng truy vấn sẽ trông giống như sau:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Tìm kiếm toàn văn bản bằng Chế độ Boolean

Chế độ boolean có lẽ là một trong những điều thú vị nhất mà tìm kiếm toàn văn bản MySQL cung cấp. Chế độ này có nhiều lưu ý duy nhất đối với nó vì nó cho phép bạn mở rộng khả năng tìm kiếm bằng cách sử dụng toán tử boolean. Khi chế độ boolean được sử dụng, các ký tự nhất định có thể có ý nghĩa đặc biệt ở đầu hoặc cuối từ. Ví dụ:

  • “+” có nghĩa là VÀ;
  • “-” nghĩa là KHÔNG;
  • Toán tử “(“ và “)” cho phép tạo biểu thức phụ;
  • Các toán tử
  • “<” và “>” thay đổi thứ hạng của giá trị tìm kiếm thấp hơn hoặc cao hơn;
  • “~” làm giảm giá trị đóng góp vào kết quả tìm kiếm;
  • Dấu ngoặc kép (“”) chỉ khớp với các giá trị theo nghĩa đen;
  • “*” là một toán tử ký tự đại diện (tham khảo phần giải thích ở trên).

Các toán tử này cho phép bạn mở rộng chức năng của tìm kiếm:ví dụ:nếu bạn muốn truy xuất tất cả các hàng có chứa từ "Demo", nhưng không phải là "Demo2", bạn có thể sử dụng một truy vấn như vậy:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

Bạn cũng có thể sử dụng dấu ngoặc kép cùng với dấu nháy đơn như sau:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Gotchas Tìm kiếm Toàn Văn bản

Trước khi sử dụng tìm kiếm toàn văn trong MySQL, hãy nhớ rằng tìm kiếm có một vài “gotchas”:

  • Cả công cụ lưu trữ InnoDB và MyISAM đều có danh sách các từ dừng riêng. Danh sách từ dừng InnoDB có thể được tìm thấy tại đây, danh sách từ dừng của MyISAM có thể được tìm thấy tại đây.
    • Để xác định danh sách từ dừng của riêng bạn cho InnoDB, hãy xác định một bảng có cấu trúc tương tự như bảng INNODB_FT_DEFAULT_STOPWORD, chèn các từ dừng vào đó, sau đó đặt giá trị của tùy chọn innodb_ft_server_stopword_table ở dạng db_name / table_name.
    • Để xác định danh sách từ dừng của riêng bạn cho MyISAM, hãy đặt biến ft_stopword_file thành tên đường dẫn của tệp chứa danh sách từ khóa. Trong tệp, các từ dừng có thể được phân tách bằng bất kỳ ký tự không có chữ và số nào ngoại trừ “_” và “‘ “. Tệp từ dừng mặc định được đặt tại storage / myisam / ft_static.c. Bạn có thể tắt từ dừng bằng cách đặt biến thành một chuỗi trống.
  • Tìm kiếm toàn văn bản không được hỗ trợ trên các bảng được phân vùng.
  • Tất cả các cột trong chỉ mục FULLTEXT phải sử dụng cùng một bộ ký tự và đối chiếu.
  • Các thao tác tìm kiếm toàn văn bản không coi chuỗi% là một ký tự đại diện.

Đây là một lưu ý khác:bạn cũng có thể muốn lưu ý rằng trình phân tích cú pháp FULLTEXT tích hợp xác định vị trí các từ bắt đầu và kết thúc bằng cách xem xét các ký tự nhất định bao gồm dấu cách (““), dấu phẩy (“, ”) Và dấu chấm (“. ”) Nghĩa là nếu chuỗi tìm kiếm của bạn chứa một hoặc nhiều ký tự đó, thì kết quả tìm kiếm có thể không chính xác. Ví dụ:nếu cơ sở dữ liệu của bạn chứa 5 hàng với chuỗi “test.demo”, truy vấn tìm kiếm “test.demo” có thể trả về nhiều kết quả hơn (10, 15, v.v.) bao gồm “demo”, “string.demo_example”, v.v. bởi vì nó sẽ tìm kiếm “demo” thay vì “test.demo”, vì vậy bạn có thể bị mắc kẹt với nhiều kết quả phù hợp không liên quan. MySQL cung cấp một giải pháp cho vấn đề này nếu bạn sẵn sàng viết plugin của riêng mình bằng C hoặc C ++ (xem tài liệu MySQL), nhưng cho đến lúc đó, bạn không thể làm được gì nhiều.

Bạn có thể xem danh sách đầy đủ các hạn chế toàn văn của MySQL tại trang tài liệu của MySQL.

Tóm tắt

Khả năng tìm kiếm toàn văn bản của MySQL cung cấp một cách đơn giản để triển khai các kỹ thuật tìm kiếm khác nhau (tìm kiếm theo ngôn ngữ tự nhiên, tìm kiếm mở rộng truy vấn và tìm kiếm boolean) vào ứng dụng chạy MySQL của bạn. Mỗi kỹ thuật tìm kiếm đó đều có những lưu ý riêng và mỗi kỹ thuật này có thể phù hợp với các mục đích khác nhau - khi quyết định có sử dụng tìm kiếm toàn văn hay không, hãy nhớ rằng kiểu tìm kiếm này có nhiều điểm tinh tế riêng biệt, biết cả lợi ích và nhược điểm của việc sử dụng tìm kiếm toàn văn bản trong MySQL và lựa chọn một cách khôn ngoan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Không thể tạo bảng (errno:150)

  2. Cấu trúc cơ sở dữ liệu tốt nhất để lưu giữ dữ liệu đa ngôn ngữ là gì?

  3. Kết nối với máy chủ MySQL từ xa bằng PHP

  4. Làm cách nào để sử dụng đúng đối tượng PDO cho truy vấn SELECT được tham số hóa

  5. Cân bằng tải PostgreSQL &Cải tiến ProxySQL - ClusterControl 1.5