Motore di ricerca per MySQL con indici fulltext
In questo articolo vedremo come creare un semplice motore di ricerca in php utilizzando gli indici fulltext di MySQL. Gli indici fulltext sono un meccanismo che consente di velocizzare le ricerche le quali risultano così molto più efficienti rispetto l’utilizzo del comando LIKE. Inoltre, con questo meccanismo, i risultati saranno visualizzati in ordine di attinenza con le chiavi di ricerca.
Affinché si possano utilizzare le ricerche fulltext bisogna prima preparare il database e, successivamente, il codice per effettuare le ricerche.
Preparazione del database
Condizione necessaria per l’utilizzo di questo tipo di ricerche è l’impostazione dei campi con indice fulltext. Tale impostazione può essere effettuata al momento della creazione della tabella o successivamente. Vediamo degli esempi.
Per impostare i campi fulltext alla creazione della tabella basta inserire nella query SQL la stringa FULLTEXT (campo1, campo2), dove i campi possono essere 1, 2 o più e sono separati da virgole. Es:
CREATE TABLE tabella(
id INT AUTOINCREMENT NOT NULL PRIMARY KEY
campo1 VARCHAR(255),
campo2 TEXT,
FULLTEXT (campo1, campo2)
);
Per inserire gli indici in una tabella già esistente basta invece utilizzare la sintassi:
ALTER TABLE tabella ADD FULLTEXT(campo1,campo2);
Se non avete voglia di scrivere la query a mano potete anche utilizzare l’interfaccia di phpmyadmin per impostare i campi: selezionate la tabella su cui aggiungere i campi, selezionate “struttura” e nella riga del campo da impostare troverete come ultima opzione una casellina che dice FULLTEXT (testo completo).
Nota: affinché si possano utilizzare gli indici fulltext è necessario che la tabella utilizzi l’engine MyISAM e che i campi siano campi di testo (VARCHAR, TEXT…..).
Sintassi per le ricerche
Il cuore delle ricerche fulltext è rappresentato dai comandi MATCH(….) e AGAINST(….) nei quali vanno inseriti rispettivamente il nome dei campi da analizzare e le chiavi di ricerca. Un esempio pratico è il seguente:
SELECT *
FROM tabella
WHERE MATCH(campo1, campo2) AGAINST(’key’);
Vi saranno risultati solo se vi sarà un valore di attinenza con la chiave di ricerca. MATCH e AGAINST producono un valore di attinenza in virgola mobile, se tale valore è zero non vi saranno risultati. La query così formata però ha il difetto di non riportare i risultati ordinati per attinenza. Quella che segue è una query più completa e funzionale.
SELECT *, MATCH(campo1, campo2) AGAINST(’key’, IN BOOLEAN MODE) AS attinenza
FROM tabella
WHERE MATCH(campo1, campo2) AGAINST(’key’, IN BOOLEAN MODE)
ORDER BY attinenza DESC;
Tale query restituisce i risultati ordinati per attinenza per come viene calcolata dai comandi MATCH e AGAINST. Nella clausola AGAINST viene utilizzato altresì la dicitura IN BOOLEAN MODE, che permette di utilizzare operatori booleani per personalizzare e migliorare le ricerche.
Operatori di ricerca
Oltre ai normali operatori AND e OR logici, nelle ricerche fulltest possono essere inseriti altri tipi di operatori per meglio filtrare i risultati, tra cui:
- Operatore +: indica che la parola a cui è anteposto deve essere presente in ogni record restituito;
- Operatore -: indica che la parola a cui è anteposto non deve essere presente in alcun record restituito;
- Operatori < e >: sono utilizzati per variare il contributo che la parola dona alla rilevanza (score) di un singolo record;
- Operatori (): le parentesi sono utili al fine di raggruppare tra loro sotto-espressioni che avranno un più alto grado di precedenza;
- Operatore ~: viene utilizzato per segnare una parola in modo che questa diminuisca l’attinenza di un record (viene utilizzato per marcare le cosidette bad words);
- Operatore *: è l’unico operatore che può essere posto alla fine della parola o di una parte di essa. Serve ad indicare che caratteri qualsiasi possono seguire la parola o precederla;
- Operatore “: le parole o frasi racchiuse tra apici doppi obbligheranno MySQL ad effettuare ricerche sulla frase completa e non su ogni singola parola.
Nel prossimo articolo vedremo come usare praticamente le ricerche fulltext con php utilizzando una semplice classe.
Tags: against, database, fulltext, in boolean mode, like, match, myisam, mysql, PHP, query, sql, text, varchar
Loading...