8722 sujets

Développement web côté serveur, CMS

Bonjour,

Recherche texte libre via requête PHP :

WHERE MATCH($champ) AGAINST('$text' IN BOOLEAN MODE)

chez OVH : Mutu avec SQL privé.

Table MyISAM cela marchait très bien sauf que par défaut ft_min_word_len = 4.
Or je veux 3, les mots de 3 lettres doivent être pris en compte, par exemple "hub usb"
Autrefois il était possible de changer cette valeur par le manager OVH.
Aujourd'hui il faut faire la demande au support, cela prend plusieurs mails, plusieurs coups de téléphone et plusieurs jours. Et à chaque mois il faut recommencer car je suppose qu'ils réinitialisent leurs réglages.

OVH m'a demandé de passer la table en InnoDB car la valeur par défaut est 3.

Petit détail ce n'est pas la même variable en InnoDB.
C'est innodb_ft_min_token_size

J'ai passé la table à la fois en UTF-8 et en InnoDB.

SHOW VARIABLES LIKE '%innodb_ft_min_token_size%';
innodb_ft_min_token_size : 3

SHOW VARIABLES LIKE '%innodb_ft_max_token_size%';
innodb_ft_max_token_size : 84

Actuellement
hub usb -> 28 produits répondent à votre demande.// BON
hub usb a -> Désolé, aucun produit ne correspond au texte « hub usb a »

Cela signifie que "a" est considéré comme un motif de recherche, comme si innodb_ft_max_token_size = 1.

Donc j'ai détruit tous les index.

Puis je les ai recréés à l'identique FULLTEXT.

Puis j'ai redémarré la base.

Et j'ai toujours le même problème.

Quelqu'un aurait-il une idée ?
Bonjour,

Pour information j'ai résolu le problème en amont.

Dans le script PHP, j'exclus les mots de moins de 3 lettres, ce qui est facile à faire.

Mais normalement je ne devrais pas avoir à le faire, car innodb_ft_min_token_size=3 interdit la prise en compte des mots de 3 lettres...

Donc si vous une idée d'une solution côté SQL je suis en attente.
Bonjour,

innodb_ft_min_token_size = 3

Cela signifie bien que les mots de moins de 3 lettres ne doivent pas être pris en compte, non ?

"hub usb a" devrait être équivalent à "hub usb"..

Le support OVH considère que le problème vient de chez moi.

Accessoirement une bonne recherche en texte libre suppose un important dictionnaire afin de prendre en compte les mots ou groupes de mots de une à deux lettres qui doivent être pris en compte.
Bonjour,

J'ai l'impression que la différence est :

Code MyISAM :

ft_min_word_len = 3


Les mots de moins de 3 lettres sont exclus par SQL

Code Innodb :

innodb_ft_min_token_size = 3


Les mots de moins de 3 lettres sont considérés comme une erreur par SQL, la requête n'est pas exécutée.

Donc les mots de moins de 3 lettres doivent être éliminés en amont par PHP.

Qu'en pensez-vous ?