Ricerca fulltext in MySQL


Lo script utilizzato in etechs per effettuare le ricrche nel sito e nel forum è uno script tutto HardCoded nel portale. Ma ho voluto estrapolare qualche concetto di modo che possa essere utile a tutti.

Inizialmente ero combattuto su come affrontare il problema della ricerca, ho pensato di sostituire tutti gli spazi con dei percento nella clusola like ma poi la query sarebbe molto pesante anche in considerazione
del fatto di poter effettuare una ricerca sia sul titolo di un articolo che sul contenuto dello stesso.
Se ad esempio un utente cercasse “frasi famose” la query da lanciare su MySQL sarebbe:

SELECT id, titolo, contenuto
FROM articoli
WHERE
(titolo like ‘%frasi%’ or titolo like ‘%famose%’ ) or (contenuto
like ‘%frasi%’ or contenuto like ‘%famose%’)

Il tutto sarebbe troppo impegnativo sia da elaborare che da costruire.
Non ben conoscendo la piattaforma su cui è basato il DB di etechs, ho provato a fare una ricerca su internet cercando un qualche bell’articoletto su MySQL e le ricerche fullText e la soluzione la si trova direttamente nel sito di MySQL http://www.mysql.com/ basta andare sulla documentazione.
Si parla quindi di Ricerche fulltext e di indici fulltext.
Per fare una ricerca fulltext abbiamo prima bisogno di un’indice full text per crearlo è abbastanza semplice, a tabella già costruita basta alterare e aggiungere un full text sui campi desiderati. Nell’esempio di prima:

ALTER TABLE articoli ADD FULLTEXT (titolo,contenuto)

si possono aggiungere + colonne contemporaneamente, ovviamente + colonne sono + è lento il DB a fare qualsiasi operazione di inserimento, modifica e cancellazione.
Per fare la ricerca invece si utilizzano le clausole MATCH ed AGAINST. Nel MATCH() vanno inserite le colonne coinvolte nerlla ricerca, di cui deve necessariamente esistere l’indice di cui sopra. Invece in AGAINST() va inserita direttamente l’interrogazione dell’utente, quindi parafrasando l’esempio di prima diventa:

SELECT id, titolo, contenuto
FROM articoli
WHERE MATCH (titolo,contenuto) AGAINST (‘frasi famose’)

Oltre a restituire i risultati esatti la clausola MATCH (titolo,contenuto) AGAINST (‘frasi famose’)
restituisce anche una valore di rilevanza dell’interrogazione che si può visualizzare ed anche ordinare, quindi la ns query finale sarà:

SELECT id, titolo, contenuto, MATCH (titolo,contenuto) AGAINST (‘frasi
famose’) as rilevanza
FROM articoli
WHERE MATCH (titolo,contenuto) AGAINST (‘frasi famose’)
ORDER BY MATCH (titolo,contenuto) AGAINST (‘frasi famose’) DESC

Le ricerche sugli articoli e le ricerche sul forum in questo sito sono costruite proprio così.

Ricerca fulltext in MySQL ultima modifica: 2005-10-03T00:00:00+00:00 da Enrico

Comments are closed.