MySQL Full Text Search

MySQL ha la possibilità di implementare un motore di ricerca con interrogazioni in linguaggio naturale, come quelle che si fanno sui motori di ricerca tipo Google. I risultati delle ricerche sono ordinati in base alla loro rilevanza.

Requisiti per implementare la ricerca full-text:

  • MySQL versione 3.23.23 o superiore
  • tabelle in formato MyISAM
  • campi di tipo CHAR, VARCHAR o TEXT
  • creazione di un indice FULLTEXT

Sintassi per ricerca di tipo "natural language":

SELECT id, MATCH (title,body) AGAINST ('Tutorial') FROM articles;

Alcune parole vengono ignorate:

  • parole con meno di 4 caratteri (impostazione di default)
  • parole che compaiono almeno nel 50% dei record
  • parole nella lista stopwords

Una stopword è una parola come "the" oppure "some" che è tanto comune da non avere valore. Esiste una lista di stopwords precompilata che può essere sovrascritta dall'amministratore.

Boolean Mode

A partire dalla versione 4.0.1 è possibile fare ricerche in modalità booleana:

SELECT * 
FROM articles 
WHERE MATCH (title,body) 
AGAINST ('+MySQL -YourSQL'IN BOOLEAN MODE);

Si possono usare operatori per chiedere che una parola sia presente (operatore "+") o assente (operatore "-"). Ci sono altri operatori per ricerche più elaborate.

Le ricerche booleane si differenziano per alcune caratteristiche particolari:

  • non usano la soglia del 50% per l'esclusione di una parola
  • non ordinano automaticamente i risultati secondo la rilevanza
  • possono funzionare anche senza indice FULLTEXT, anche se query di questo tipo saranno abbastanza lente

Indici

Creazione di un indice FULLTEXT su una tabella esistente:

ALTER TABLE articles ADD FULLTEXT (title,body);

Creazione di un indice FULLTEXT al momento della creazione di una tabella:

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
);

Riferimenti: Full-Text Search Functions (mysql.com)