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.
mysql full-text like
Commentami!