sql >> Database >  >> RDS >> MariaDB

Hoe MATCH AGAINST werkt in MariaDB

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


  1. Een sorteervolgordekolom gebruiken in een databasetabel

  2. Geen enkele vorm van databasecaching om dubbele databasequery's te verminderen.

  3. Doe mee aan een telquery op generation_series() en haal null-waarden op als '0'

  4. Voeg query toe met alleen kolommen die alle waarden in de `in`-clausule hebben