Chế độ ngôn ngữ tự nhiên tìm kiếm toàn văn mysql

Tìm kiếm toàn văn bản trong máy chủ MySQL cho phép người dùng chạy truy vấn toàn văn bản đối với dữ liệu dựa trên ký tự trong bảng MySQL. Bạn phải tạo chỉ mục toàn văn trên bảng trước khi chạy truy vấn toàn văn trên bảng. Chỉ mục toàn văn có thể bao gồm một hoặc nhiều cột dựa trên ký tự trong bảng

  • FULLTEXT là kiểu chỉ mục của chỉ mục toàn văn trong MySQL
  • Các bảng InnoDB hoặc MyISAM sử dụng các chỉ mục toàn văn
  • Các chỉ mục toàn văn chỉ có thể được tạo cho các cột VARCHAR, CHAR hoặc TEXT
  • Định nghĩa chỉ mục FULLTEXT có thể được đưa ra trong câu lệnh CREATE TABLE hoặc có thể được thêm vào sau bằng cách sử dụng ALTER TABLE hoặc CREATE INDEX
  • Tập dữ liệu lớn không có chỉ mục FULLTEXT tải dữ liệu vào bảng nhanh hơn nhiều so với tải dữ liệu vào bảng có chỉ mục FULLTEXT hiện có. Do đó, tạo chỉ mục sau khi tải dữ liệu

Phiên bản MySQL. 5. 6

cú pháp

MATCH (col1,col2,col3...) AGAINST (expr [search_modifier])
  • col1, col2, col3 - Danh sách được phân tách bằng dấu phẩy đặt tên cho các cột được tìm kiếm
  • AGAINST() lấy một chuỗi để tìm kiếm và một công cụ sửa đổi tùy chọn cho biết loại tìm kiếm sẽ thực hiện
  • Chuỗi tìm kiếm phải là một giá trị chuỗi. Giá trị không đổi trong quá trình đánh giá truy vấn

Có ba loại tìm kiếm toàn văn

  • Tìm kiếm toàn văn bằng ngôn ngữ tự nhiên
  • Tìm kiếm toàn văn Boolean
  • Tìm kiếm mở rộng truy vấn

Ghi chú. Một số từ bị bỏ qua trong các tìm kiếm toàn văn

  • Độ dài tối thiểu của từ để tìm kiếm toàn văn như sau
    • Ba ký tự cho chỉ mục tìm kiếm InnoDB
    • Bốn ký tự cho chỉ mục tìm kiếm MyISAM
  • Từ dừng là những từ rất phổ biến như 'on', 'the' hoặc 'it', xuất hiện trong hầu hết các tài liệu. Những loại từ này bị bỏ qua trong quá trình tìm kiếm

Tìm kiếm toàn văn bằng ngôn ngữ tự nhiên

Tìm kiếm toàn văn bằng ngôn ngữ tự nhiên diễn giải chuỗi tìm kiếm dưới dạng văn bản tự do (ngôn ngữ tự nhiên của con người) và không yêu cầu toán tử đặc biệt nào. Tìm kiếm toàn văn là tìm kiếm ngôn ngữ tự nhiên nếu công cụ sửa đổi CHẾ ĐỘ NGÔN NGỮ TỰ NHIÊN (xem cú pháp sau) được cung cấp hay không. Hàm MATCH() tìm kiếm một chuỗi dựa vào tập hợp văn bản (Tập hợp một hoặc nhiều cột có trong chỉ mục FULLTEXT. ). Đối với mỗi hàng trong bảng, hàm MATCH() trả về một giá trị liên quan;

Định dạng cơ bản của truy vấn chế độ tìm kiếm văn bản null Ngôn ngữ tự nhiên như sau

Mã số

SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN NATURAL LANGUAGE MODE)

Ví dụ

mysql> CREATE TABLE tutorial (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
title VARCHAR(200), 
description TEXT, 
FULLTEXT(title,description)
) ENGINE=InnoDB;
Query OK, 0 rows affected (2.40 sec)

Hãy chèn một số bản ghi vào bảng hướng dẫn

mysql>INSERT INTO tutorial (title,description) VALUES
('SQL Joins','An SQL JOIN clause combines rows from two or more tables. It creates a set of rows in a temporary table.'),
('SQL Equi Join','SQL EQUI JOIN performs a JOIN against equality or matching column(s) values of the associated tables. An equal sign (=) is used as comparison operator in the where clause to refer equality.'),
('SQL Left Join','The SQL LEFT JOIN, joins two tables and fetches rows based on a condition, which is matching in both the tables and the unmatched rows will also be available from the table before the JOIN clause.'),
('SQL Cross Join','The SQL CROSS JOIN produces a result set which is the number of rows in the first table multiplied by the number of rows in the second table, if no WHERE clause is used along with CROSS JOIN.'),
('SQL Full Outer Join','In SQL the FULL OUTER JOIN combines the results of both left and right outer joins and returns all (matched or unmatched) rows from the tables on both sides of the join clause.'),
('SQL Self Join','A self join is a join in which a table is joined with itself (which is also called Unary relationships), especially when the table has a FOREIGN KEY which references its own PRIMARY KEY.');

Hãy tìm kiếm chuỗi 'trái phải' trong trường mô tả

mysql> SELECT * FROM tutorial WHERE MATCH(title,description) AGAINST ('left right' IN NATURAL LANGUAGE MODE);
+----+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | title               | description                                                                                                                                                                                            |
+----+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  5 | SQL Full Outer Join | In SQL the FULL OUTER JOIN combines the results of both left and right outer joins and returns all (matched or unmatched) rows from the tables on both sides of the join clause.                       |
|  3 | SQL Left Join       | The SQL LEFT JOIN, joins two tables and fetches rows based on a condition, which are matching in both the tables, and the unmatched rows will also be available from the table before the JOIN clause. |
+----+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Theo mặc định, tìm kiếm không phân biệt chữ hoa chữ thường. Để thực hiện tìm kiếm toàn văn phân biệt chữ hoa chữ thường, hãy sử dụng đối chiếu nhị phân cho các cột được lập chỉ mục. Ví dụ: một cột sử dụng bộ ký tự latin1 có thể được chỉ định đối chiếu latin1_bin để phân biệt chữ hoa chữ thường đối với các tìm kiếm toàn văn

Khi MATCH() được sử dụng trong mệnh đề WHERE, như trong ví dụ được hiển thị trước đó, các hàng được trả về sẽ tự động được sắp xếp với mức độ liên quan cao nhất trước tiên

  • Các giá trị liên quan là các số dấu phẩy động không âm
  • Không liên quan có nghĩa là không có sự tương đồng
  • Mức độ liên quan được tính toán dựa trên -
    • số từ trong hàng
    • số lượng từ duy nhất trong hàng đó
    • tổng số từ trong bộ sưu tập
    • số lượng tài liệu (hàng) có chứa một từ cụ thể

Ví dụ sau đây cho thấy cách truy xuất các giá trị liên quan một cách rõ ràng

<
mysql> SELECT id, MATCH(title,description) AGAINST ('left right' IN NATURAL LANGUAGE MODE) AS score FROM tutorial;
+----+---------------------+
| id | score               |
+----+---------------------+
|  1 |                   0 |
|  2 |                   0 |
|  3 | 0.45528939366340637 |
|  4 |                   0 |
|  5 |  0.8331640362739563 |
|  6 |                   0 |
+----+---------------------+
6 rows in set (0.00 sec)

Đếm trận đấu

Để đếm các trận đấu, bạn có thể sử dụng một truy vấn như thế này

mysql> SELECT COUNT(*) FROM tutorial WHERE  MATCH(title,description) AGAINST ('left right' IN NATURAL LANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.03 sec)

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

Tìm kiếm boolean diễn giải chuỗi tìm kiếm bằng cách sử dụng các quy tắc của ngôn ngữ truy vấn đặc biệt. Chuỗi chứa các từ cần tìm. Nó cũng có thể chứa các toán tử xác định các yêu cầu chẳng hạn như một từ phải có hoặc không có trong các hàng phù hợp hoặc từ đó phải có trọng số cao hơn hoặc thấp hơn bình thường. Một số từ phổ biến (từ dừng) bị bỏ qua khỏi chỉ mục tìm kiếm và không khớp nếu có trong chuỗi tìm kiếm. MySQL có thể thực hiện tìm kiếm toàn văn boolean bằng công cụ sửa đổi IN BOOLEAN MODE . Với công cụ sửa đổi này, một số ký tự có ý nghĩa đặc biệt ở đầu hoặc cuối từ trong chuỗi tìm kiếm

Định dạng cơ bản của truy vấn chế độ boolean như sau

Mã số

SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN BOOLEAN MODE)

Đặc điểm của tìm kiếm Toàn văn Boolean

  • Không sử dụng ngưỡng 50% áp dụng cho chỉ mục tìm kiếm MyISAM
  • Không tự động sắp xếp hàng theo mức độ liên quan giảm dần
  • Các truy vấn Boolean đối với chỉ mục tìm kiếm MyISAM có thể hoạt động ngay cả khi không có chỉ mục FULLTEXT
  • Áp dụng các tham số toàn văn có độ dài từ tối thiểu và tối đa
    • Đối với các chỉ mục tìm kiếm InnoDB, innodb_ft_min_token_size và innodb_ft_max_token_size
    • cho các chỉ mục tìm kiếm MyISAM, ft_min_word_len và ft_max_word_len
  • Tìm kiếm toàn văn bản InnoDB không hỗ trợ sử dụng nhiều toán tử trên một từ tìm kiếm

Tìm kiếm toàn văn boolean hỗ trợ các toán tử sau

Toán tửMô tảVí dụ

+

 

Dấu cộng ở đầu biểu thị rằng một từ phải có trong mỗi hàng được trả về

'+join +union'
Tìm hàng chứa cả hai từ.
'+join union'
Tìm kiếm các hàng có chứa từ 'join', nhưng xếp hạng các hàng cao hơn nếu chúng cũng chứa từ 'union'

-Dấu ​​trừ phía trước cho biết rằng một từ cụ thể không được xuất hiện trong bất kỳ hàng nào được trả về. Toán tử - chỉ hoạt động để loại trừ các hàng không khớp với các cụm từ tìm kiếm khác. '+join -union'
Tìm các hàng chứa từ 'join' nhưng không chứa từ 'union'. (không có toán tử)Theo mặc định, từ này là tùy chọn, nhưng các hàng chứa từ này được xếp hạng cao hơn. 'join -union'
Tìm kiếm các hàng chứa ít nhất một trong hai từ. >< Hai toán tử này được sử dụng để thay đổi phần đóng góp của một từ vào giá trị liên quan được gán cho một hàng. Toán tử > tăng mức đóng góp và toán tử < giảm mức đóng góp. '+join +(>left
Tìm các hàng có chứa từ 'tham gia' và 'trái' hoặc 'tham gia' và 'phải' (theo thứ tự bất kỳ), nhưng xếp hạng ' . ( ) Dấu ngoặc đơn nhóm các từ thành các biểu thức con. Các nhóm được đặt trong ngoặc đơn có thể được lồng vào nhau. ~ Dấu ngã đứng đầu hoạt động như một toán tử phủ định, làm cho phần đóng góp của từ vào mức độ liên quan của hàng là phủ định. '+join ~left'
Tìm các hàng có chứa từ 'tham gia', nhưng nếu hàng đó cũng chứa từ 'left', hãy xếp hạng thấp hơn nếu hàng không có. *Dấu hoa thị đóng vai trò là toán tử cắt ngắn (hoặc ký tự đại diện). Không giống như các toán tử khác, nó được thêm vào từ bị ảnh hưởng. Các từ khớp nếu chúng bắt đầu bằng từ đứng trước toán tử *. 'tham gia*'
Tìm các hàng có chứa các từ như 'tham gia', 'tham gia', 'tham gia', v.v. "Cụm từ được đặt trong dấu ngoặc kép (""”) các ký tự chỉ khớp với các hàng chứa cụm từ theo nghĩa đen, như nó đã được nhập. '"tham gia trái"'
Tìm các hàng chứa cụm từ chính xác "hãy tham gia".

Ví dụ. Tìm kiếm toàn văn Boolean

Trong truy vấn sau đây, truy vấn sẽ truy xuất tất cả các hàng có chứa từ  'Tham gia' chứ không phải từ 'đúng'.  

Làm cách nào để tìm kiếm FULLTEXT 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.

InnoDB có hỗ trợ đầy đủ không

Chỉ có thể sử dụng chỉ mục toàn văn với các bảng MyISAM, Aria, InnoDB và Mroonga và chỉ có thể được tạo cho các cột CHAR, VARCHAR hoặc TEXT.

Làm cách nào để sử dụng chỉ mục FULLTEXT trong MySQL?

Trong MySQL, chỉ mục toàn văn bản luôn được đặt tên là FULLTEXT. Chúng ta có thể định nghĩa chỉ mục toàn văn bản có kiểu dữ liệu cột là CHAR, VARCHAR và TEXT. Chúng ta có thể xác định chỉ mục toàn văn trong khi tạo bảng bằng cách sử dụng câu lệnh CREATE TABLE hoặc sử dụng câu lệnh ALTER TABLE hoặc CREATE INDEX cho bảng hiện có .

Khi nào sử dụng đầy đủ

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 . Các chỉ mục FULLTEXT chỉ có thể được tạo cho các cột CHAR, VARCHAR hoặc TEXT. Các chỉ mục FULLTEXT chỉ được sử dụng khi mệnh đề MATCH() AGAINST() được sử dụng.