sql >> Databáze >  >> RDS >> MariaDB

Jak funguje MATCH PROTI v MariaDB

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.      |
+----+---------------------------------+---------------------------------------+


  1. Jak vypustit sloupec v SQL?

  2. SQL:BETWEEN vs <=a>=

  3. Oprava:Přístup odepřen uživateli ‚root‘@‘localhost‘ v MariaDB

  4. MySQL Pořadí podle čísla, Null poslední