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