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

Mystère de la recherche en texte intégral MySQL

À partir de documentation MySQL

  • + Un signe plus au début indique que ce mot doit être présent dans chaque ligne renvoyée.

  • * L'astérisque sert d'opérateur de troncature (ou caractère générique). Contrairement aux autres opérateurs, il doit être ajouté au mot à affecter. Les mots correspondent s'ils commencent par le mot précédant l'opérateur *.

    Si un mot est spécifié avec l'opérateur de troncation, il n'est pas supprimé d'une requête booléenne, même s'il est trop court (comme déterminé à partir du paramètre ft_min_word_len) ou d'un mot vide. Cela se produit parce que le mot n'est pas considéré comme trop court ou comme un mot vide, mais comme un préfixe qui doit être présent dans le document sous la forme d'un mot commençant par le préfixe .

En contexte :

MATCH(...) CONTRE(...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) signifie que vous recherchez des lignes où un mot dans le name la colonne doit contenir ski , et doit commencer avec le mot ski .

À partir de l'ensemble que vous avez publié, Dartmouth Skiway est le seul name conforme à ces exigences :il contient le mot ski , et est préfixé par le mot ski .

L'autre name colonnes, même si elles correspondent à la première règle :doit contenir ski , ils ne sont pas préfixés par ski , comme stipulé dans votre règle. La ligne renvoyée par votre recherche booléenne est la seule avec un name colonne qui contient un mot qui contient à la fois ski et est un mot préfixé par ski .

Comme suggéré par ajreal, essayez de diminuer le ft_min_len_word_setting dans my.cnf . Votre recherche peut ne pas fournir les résultats que vous attendez en raison du paramètre par défaut. Essayez de le réduire à 3.

Colonne WHERE LIKE %text%

WHERE name LIKE "%ski%" recherche les lignes avec name colonnes contenant ski , peu importe où le mot apparaît.