Ricerche Full-Text in MySQL

Mattepuffo's logo
Ricerche Full-Text in MySQL

Ricerche Full-Text in MySQL

Nella maggior parte dei casi per fare delle ricerche non precise, si usa LIKE.

LIKE però soffre di lentezza quando esegue query pesanti.

Un modo per ovviare è usare ricerche Full-Text che sono parecchie più performanti.

Non è tutto oro quel luccica però perchè per usare Full-Text bisogna tenere in considerazione alcune cose:

  • è possibile farla solo su campi di tipo testo
  • bisogna creare un indice full-text
  • le tabelle non possono esserer di tpo InnoDB

Comunque, prima di tutto creiamo un indice:

ALTER TABLE tabellaADD FULLTEXT(campo1, campo2, campo3, ...);

L'indice può anche essere aggiunto in fase di creazione tabella ovviamente.

Vediamo una query di esempio:

SELECT * FROM book

WHERE MATCH(titolo, autore, editor)

AGAINST('2001 odissea nello spazio');

La sequenza di comandi MATCH() - AGAINST() restituisce il valore di attinenza del risultato con il testo cercato (numero in floating-point compreso tra 0 e 10).

Quindi, considerando che la clausola WHERE per essere verificata deve avere valore booleano “true”, se il risultato in questione ha attinenza 0 su 10 (nessuna attinenza) viene scartato; in sostanza vengono presi in considerazione solo i risultati con attinenza maggiore di 0.

Una query più giusta per sfruttare al meglio Full-Text potrebbe essere questa:

SELECT *,MATCH(titolo, autore, editor) AGAINST('2001 odissea nello spazio') AS Attinenza 

FROM book

WHERE MATCH(titolo, autore, editor) AGAINST('2001 odissea nello spazio')

ORDER BY Attinenza DESC

Così i risultati vengono resituiti in ordine di attinenza (da quello che ha più attinenza a quello che ne ha di meno).

Da un punto di vista prestazionale devo ammettere che Full-Text è più veloce di LIKE, però lo considero meno flessibile.


Condividi

Commentami!