Trong MariaDB, MATCH AGAINST
là một cấu trúc đặc biệt được sử dụng để thực hiện tìm kiếm toàn văn trên một chỉ mục toàn văn.
Cú pháp
Cú pháp như sau:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Ví dụ
Giả sử chúng ta có một bảng được gọi là Products
bao gồm các dữ liệu sau:
+----+---------------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 5 | Sledge Hammer | Wooden handle. Free wine glasses. | | 6 | Chainsaw | Orange. Includes spare fingers. | | 7 | Straw Dog Box | Tied with vines. Very chewable. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+-----------------------------------------+
Bảng này có một chỉ mục toàn văn trên ProductDescription
của nó cột. Điều đó có nghĩa là chúng ta có thể sử dụng MATCH AGAINST
để thực hiện tìm kiếm toàn văn đối với cột đó.
Ví dụ:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Kết quả:
+----+--------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+--------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 6 | Chainsaw | Orange. Includes spare fingers. | +----+--------------------------+-----------------------------------------+
Nhận điểm
Chúng tôi có thể bao gồm MATCH AGAINST
trong SELECT
danh sách để trả về điểm phù hợp của từ khóa trong / các cột được tìm kiếm:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Kết quả:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
Trong trường hợp này, chúng tôi cũng sử dụng ORDER BY
mệnh đề sắp xếp theo điểm số theo thứ tự giảm dần (tức là phù hợp nhất trước).
Các cột không có chỉ mục toàn văn bản
Lý do khiến ví dụ trước hoạt động là vì trước đó tôi đã tạo chỉ mục toàn văn trên ProductDescription
cột. Nếu tôi không làm điều này, tôi sẽ nhận được lỗi.
Đây là những gì sẽ xảy ra khi chúng tôi cố gắng sử dụng MATCH AGAINST
chống lại cột không có chỉ mục toàn văn:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Kết quả:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Hãy thêm một chỉ mục toàn văn vào ProductName
cột:
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Bây giờ hãy chạy lại truy vấn:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Kết quả:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Lần này nó đã hoạt động.
Chỉ mục toàn văn bản trên nhiều cột
Chúng tôi có thể thêm các chỉ mục toàn văn trên nhiều cột.
Ví dụ:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Bây giờ chúng ta có thể chạy MATCH AGAINST
chống lại chỉ mục toàn văn đó.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Kết quả:
+----+---------------------------------+---------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+---------------------------------------+ | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+---------------------------------------+