MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona MATCH AGAINST in MariaDB

In MariaDB, MATCH AGAINST è un costrutto speciale utilizzato per eseguire una ricerca full-text su un indice full-text.

Sintassi

La sintassi è questa:

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

Esempio

Supponiamo di avere una tabella chiamata Products che include i seguenti dati:

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

Questa tabella ha un indice full-text nella sua ProductDescription colonna. Ciò significa che possiamo usare MATCH AGAINST per eseguire una ricerca full-text in quella colonna.

Esempio:

SELECT 
    ProductId AS "Id",
    ProductName,
    ProductDescription
FROM Products 
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;

Risultato:

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

Ottieni il punteggio

Possiamo includere MATCH AGAINST nel SELECT elenco per restituire il punteggio di pertinenza della parola chiave all'interno della/e colonna/e cercata:

SELECT 
    ProductDescription,
    MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products 
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;

Risultato:

+-----------------------------------------+---------------------+
| 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 questo caso abbiamo utilizzato anche un ORDER BY clausola per ordinare in base al punteggio in ordine decrescente (cioè il più rilevante per primo).

Colonne senza un indice full-text

Il motivo per cui l'esempio precedente ha funzionato è perché in precedenza avevo creato un indice full-text su ProductDescription colonna. Se non l'avessi fatto, avrei ricevuto un errore.

Ecco cosa succede quando proviamo a utilizzare MATCH AGAINST su una colonna che non ha un indice full-text:

SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

Risultato:

ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

Aggiungiamo un indice full-text su ProductName colonna:

ALTER TABLE Products
ADD FULLTEXT(ProductName);

Ora esegui di nuovo la query:

SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

Risultato:

+-----------+--------------------------+--------------+
| ProductId | ProductName              | ProductPrice |
+-----------+--------------------------+--------------+
|         1 | Left handed screwdriver  |        25.99 |
|         2 | Right handed screwdriver |        25.99 |
+-----------+--------------------------+--------------+

Questa volta ha funzionato.

Indice full-text su più colonne

Possiamo aggiungere indici full-text su più colonne.

Esempio:

ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);

Ora possiamo eseguire MATCH AGAINST contro quell'indice full-text.

SELECT 
    ProductId AS Id, 
    ProductName, 
    ProductDescription
FROM Products 
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;

Risultato:

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