Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faites-vous pour que votre recherche booléenne Fulltext reprenne le terme C++ ?

Vous devrez changer l'idée que se fait MySQL de ce qu'est un mot.

Tout d'abord, la longueur de mot minimale par défaut est de 4. Cela signifie qu'aucun terme de recherche contenant uniquement des mots de <4 lettres ne correspondra jamais, que ce soit « C++ » ou « cpp ». Vous pouvez le configurer en utilisant ft_min_word_len option de configuration, par ex. dans votre mon.cfg :

[mysqld]
ft_min_word_len=3

(Puis arrêtez/démarrez MySQLd et reconstruisez les index de texte intégral.)

Deuxièmement, "+" n'est pas considéré comme une lettre par MySQL. Vous pouvez en faire une lettre, mais cela signifie que vous ne pourrez pas rechercher le mot "poisson" dans la chaîne "poisson + frites", donc une certaine prudence est requise. Et ce n'est pas anodin :cela nécessite de recompiler MySQL ou de pirater un jeu de caractères existant. Voir la section commençant par "Si vous souhaitez modifier le jeu de caractères considérés comme des caractères de mot..." dans chapitre 11.8.6 du document.

Oui, quelque chose comme ça est une solution courante :vous pouvez conserver vos données « réelles » (sans les échapper) dans une table principale et définitive — généralement en utilisant InnoDB pour la conformité ACID. Ensuite, une table MyISAM auxiliaire peut être ajoutée, contenant uniquement les mots mutilés pour les appâts de recherche en texte intégral. Vous pouvez également faire une forme limitée de stemming en utilisant cette approche.

Une autre possibilité consiste à détecter les recherches que MySQL ne peut pas effectuer, telles que celles contenant uniquement des mots courts ou des caractères inhabituels, et à revenir à une recherche LIKE ou REGEXP simple mais lente pour ces recherches uniquement. Dans ce cas, vous souhaiterez probablement également supprimer la liste d'arrêt en définissant ft_stopword_file en une chaîne vide, car il n'est pas pratique de tout sélectionner comme spécial également.