sql >> Databasteknik >  >> RDS >> MariaDB

Hur MATCH MOT fungerar i MariaDB

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


  1. Använder du rätt databasprestandaövervakningsverktyg?

  2. Förstå skillnaderna mellan tabell- och transaktions-API:er

  3. Är det möjligt att ange villkor i Count()?

  4. Hur man importerar och exporterar en MySQL-databas