I MariaDB, MATCH AGAINST
är en speciell konstruktion som används för att utföra en fulltextsökning på ett fulltextindex.
Syntax
Syntaxen ser ut så här:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Exempel
Anta att vi har en tabell som heter Products
som inkluderar följande data:
+----+---------------------------------+-----------------------------------------+ | 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. | +----+---------------------------------+-----------------------------------------+
Den här tabellen har ett fulltextindex på sin ProductDescription
kolumn. Det betyder att vi kan använda MATCH AGAINST
för att göra en fulltextsökning mot den kolumnen.
Exempel:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Resultat:
+----+--------------------------+-----------------------------------------+ | 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. | +----+--------------------------+-----------------------------------------+
Få poängen
Vi kan inkludera MATCH AGAINST
i SELECT
lista för att returnera relevanspoängen för sökordet i den/de sökta kolumnerna:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Resultat:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
I det här fallet använde vi också en ORDER BY
sats för att sortera efter poängen i fallande ordning (dvs. mest relevant först).
Kolumner utan ett fulltextindex
Anledningen till att det föregående exemplet fungerade är att jag tidigare hade skapat ett fulltextindex på ProductDescription
kolumn. Om jag inte hade gjort det här skulle jag ha fått ett felmeddelande.
Här är vad som händer när vi försöker använda MATCH AGAINST
mot en kolumn som inte har ett fulltextindex:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Resultat:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Låt oss lägga till ett fulltextindex på ProductName
kolumn:
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Kör nu frågan igen:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Resultat:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Den här gången fungerade det.
Fulltextindex på flera kolumner
Vi kan lägga till fulltextindex på flera kolumner.
Exempel:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Nu kan vi köra MATCH AGAINST
mot det fulltextindexet.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Resultat:
+----+---------------------------------+---------------------------------------+ | 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. | +----+---------------------------------+---------------------------------------+