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

Comment faire une recherche en texte intégral mysql sur plusieurs colonnes où des mots partiels sont mis en correspondance

En mode booléen, exiger que les chaînes soient présentes (au lieu de simplement marquer plus haut), se fait avec + . la correspondance des préfixes se fait avec une terminaison * . Cela semble être ce que vous voulez, alors recherchez :

+John* +S*
+John* +Smith*
+Smith* +J*
+Jo* +S*

Notez que les index de texte intégral ne peuvent pas vous aider à rechercher « n'importe où dans un mot ». donc quelque chose comme *mith* est voué à l'échec :ils sont censés correspondre à partir du caractère 1 d'un index.

Si vous souhaitez également les trier par valeurs de correspondance, et par exemple, avez besoin de John Smith avant Johnny Smithson , vous feriez ceci :

 SELECT * FROM user 
 WHERE MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE)
 ORDER BY MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE) DESC;

Ce que vous verrez ne vous mènera nulle part à moins que vous n'ajoutiez tous les mots>=ft_min_word_len à nouveau séparément :

+John* +S* John
+John* +Smith* John Smith
+Smith* +J* Smith
+Jo* +S*

Pour le dernier, les deux sont ft_min_world_len différemment est souhaité.