In MariaDB, MATCH AGAINST
is een speciale constructie die wordt gebruikt om een volledige tekstzoekopdracht uit te voeren op een volledige tekstindex.
Syntaxis
De syntaxis gaat als volgt:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Voorbeeld
Stel dat we een tabel hebben met de naam Products
die de volgende gegevens bevat:
+----+---------------------------------+-----------------------------------------+ | 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. | +----+---------------------------------+-----------------------------------------+
Deze tabel heeft een full-text index op zijn ProductDescription
kolom. Dat betekent dat we MATCH AGAINST
. kunnen gebruiken om een volledige tekst te zoeken in die kolom.
Voorbeeld:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Resultaat:
+----+--------------------------+-----------------------------------------+ | 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. | +----+--------------------------+-----------------------------------------+
De score ophalen
We kunnen MATCH AGAINST
. opnemen in de SELECT
lijst om de relevantiescore van het trefwoord in de gezochte kolom(men) te retourneren:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Resultaat:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
In dit geval gebruikten we ook een ORDER BY
clausule om te sorteren op score in aflopende volgorde (d.w.z. meest relevante eerst).
Kolommen zonder een volledige tekstindex
De reden waarom het vorige voorbeeld werkte, is omdat ik eerder een full-text index had gemaakt op de ProductDescription
kolom. Als ik dit niet had gedaan, zou ik een foutmelding hebben gekregen.
Dit gebeurt er als we MATCH AGAINST
proberen te gebruiken tegen een kolom die geen volledige tekstindex heeft:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Resultaat:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Laten we een full-text index toevoegen aan de ProductName
kolom:
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Voer de query nu opnieuw uit:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Resultaat:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Deze keer werkte het.
Full-Text Index op meerdere kolommen
We kunnen full-text indexen toevoegen aan meerdere kolommen.
Voorbeeld:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Nu kunnen we MATCH AGAINST
uitvoeren tegen die full-text index.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Resultaat:
+----+---------------------------------+---------------------------------------+ | 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. | +----+---------------------------------+---------------------------------------+