Mysql
 sql >> Database >  >> RDS >> Mysql

Come fai a fare in modo che la tua ricerca booleana Fulltext raccolga il termine C++?

Dovrai cambiare l'idea di MySQL su cosa sia una parola.

Innanzitutto, la lunghezza minima della parola predefinita è 4. Ciò significa che nessun termine di ricerca contenente solo parole di <4 lettere potrà mai corrispondere, sia che si tratti di 'C++' o 'cpp'. Puoi configurarlo utilizzando ft_min_word_len opzione di configurazione, ad es. nel tuo my.cfg:

[mysqld]
ft_min_word_len=3

(Quindi arresta/avvia MySQLd e ricostruisci gli indici fulltext.)

In secondo luogo, "+" non è considerata una lettera da MySQL. Puoi trasformarla in una lettera, ma ciò significa che non sarai in grado di cercare la parola "pesce" nella stringa "pesce + patatine", quindi è necessaria una certa attenzione. E non è banale:richiede la ricompilazione di MySQL o l'hacking di un set di caratteri esistente. Vedere la sezione che inizia con "Se si desidera modificare l'insieme di caratteri considerati caratteri di parole..." in sezione 11.8.6 del documento.

Sì, qualcosa del genere è una soluzione comune:puoi conservare i tuoi dati "reali" (senza l'escape) in una tabella primaria e definitiva —"di solito utilizzando InnoDB per la conformità ACID. Quindi può essere aggiunta una tabella MyISAM ausiliaria, contenente solo le parole alterate per l'esca di ricerca fulltext. Puoi anche eseguire una forma limitata di stemming usando questo approccio.

Un'altra possibilità è rilevare le ricerche che MySQL non può eseguire, come quelle con solo parole brevi o caratteri insoliti, e ricorrere a una ricerca LIKE o REGEXP semplice ma lenta solo per quelle ricerche. In questo caso probabilmente vorrai anche rimuovere la stoplist impostando ft_stopword_file a una stringa vuota, dal momento che non è pratico raccogliere tutto anche in quella come speciale.