V MariaDB MATCH AGAINST
je speciální konstrukce používaná k provádění fulltextového vyhledávání ve fulltextovém indexu.
Syntaxe
Syntaxe vypadá takto:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Příklad
Předpokládejme, že máme tabulku nazvanou Products
který zahrnuje následující údaje:
+----+---------------------------------+-----------------------------------------+ | 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. | +----+---------------------------------+-----------------------------------------+
Tato tabulka má ve svém ProductDescription
fulltextový index sloupec. To znamená, že můžeme použít MATCH AGAINST
k provedení fulltextového vyhledávání v tomto sloupci.
Příklad:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Výsledek:
+----+--------------------------+-----------------------------------------+ | 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. | +----+--------------------------+-----------------------------------------+
Získejte skóre
Můžeme zahrnout MATCH AGAINST
v SELECT
seznam, aby se vrátilo skóre relevance klíčového slova v rámci hledaných sloupců:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Výsledek:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
V tomto případě jsme také použili ORDER BY
klauzule k řazení podle skóre v sestupném pořadí (tj. nejrelevantnější jako první).
Sloupce bez fulltextového indexu
Důvod, proč předchozí příklad fungoval, je ten, že jsem dříve vytvořil fulltextový index na ProductDescription
sloupec. Kdybych to neudělal, zobrazila by se mi chyba.
Zde je to, co se stane, když se pokusíme použít MATCH AGAINST
proti sloupci, který nemá fulltextový index:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Výsledek:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Pojďme přidat fulltextový index na ProductName
sloupec:
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Nyní spusťte dotaz znovu:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Výsledek:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Tentokrát to fungovalo.
Plnotextový index ve více sloupcích
Můžeme přidat fulltextové indexy na více sloupců.
Příklad:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Nyní můžeme spustit MATCH AGAINST
proti tomuto fulltextovému indexu.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Výsledek:
+----+---------------------------------+---------------------------------------+ | 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. | +----+---------------------------------+---------------------------------------+