2009-02-25 6 views
8

Donc, j'ai besoin de savoir comment faire une recherche booléenne fulltext sur une base de données MySQL pour retourner un enregistrement contenant le terme "C++".Comment obtenez-vous votre recherche booléenne Fulltext pour obtenir le terme C++?

J'ai ma chaîne de recherche SQL comme:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

Bien que tous mes champs contiennent la chaîne C++, il est jamais retourné dans les résultats de recherche.

Comment puis-je modifier MySQL pour y remédier? C'est possible? La seule solution que j'ai trouvée serait d'échapper le caractère + pendant le processus d'entrée de mes données comme quelque chose comme "__plus" et de modifier ma recherche pour accommoder, mais cela semble lourd et il doit y avoir une meilleure façon .

+0

Que diable est une recherche booléenne de texte intégral? Cela ressemble énormément à ce que vous avez inventé. De plus, votre question est très vague. Vous devez fournir une meilleure description de votre problème, ce que vous essayez de faire. Sinon, nous ne pouvons pas vous aider. –

+0

@John: Vous êtes très dur. J'ai dû m'abstenir de lier à lmgtfy, donc voici une explication de MySQL: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html –

+0

@A. Rex - Je suis diabolique (dans un sens) mon point de vue peut être sévère, mais la question manque en ce qui concerne la façon d'exprimer une bonne question. En tant que tel nous (les gens de débordement de pile) sont incapables de fournir une bonne réponse basée sur l'information insuffisante. –

Répondre

8

Comment puis-je modifier MySQL pour y remédier?

Vous devrez changer l'idée de MySQL de ce qu'est un mot. Premièrement, la longueur minimale des mots par défaut est 4. Cela signifie qu'aucun terme de recherche contenant uniquement des mots de < 4 lettres ne correspondra, que ce soit 'C++' ou 'cpp'. Vous pouvez le configurer en utilisant l'option de configuration ft_min_word_len, par ex. dans votre my.cfg:

[mysqld] 
ft_min_word_len=3 

(Puis arrêtez/lanciez mysqld et reconstruire des indices en texte intégral.)

En second lieu, « + » est pas considéré comme une lettre par MySQL. Vous pouvez en faire une lettre, mais cela signifie que vous ne serez pas en mesure de rechercher le mot «poisson» dans la chaîne «fish + chips», donc il faut faire attention. Et ce n'est pas trivial: il faut recompiler MySQL ou pirater un jeu de caractères existant. Voir la section commençant par "Si vous voulez changer l'ensemble des caractères qui sont considérés comme des caractères de mot ..." dans section 11.8.6 de la doc.

échapper le caractère + au cours du processus d'entrer dans mes données quelque chose comme « __plus » puis modifier ma recherche pour accueillir

Oui, quelque chose comme ça est une solution commune: vous pouvez garder votre Données 'réelles' (sans l'échappement) dans une table primaire et définitive - en utilisant généralement InnoDB pour la conformité ACID. Ensuite, une table auxiliaire MyISAM peut être ajoutée, contenant uniquement les mots mutilés pour l'appât de recherche de texte intégral. Vous pouvez également faire une forme limitée de stemming en utilisant cette approche. Une autre possibilité est de détecter les recherches que MySQL ne peut effectuer, telles que celles qui ne comportent que des mots courts ou des caractères inhabituels, et de revenir à une recherche LIKE ou REGEXP simple mais lente pour ces recherches uniquement. Dans ce cas, vous voudrez probablement également supprimer la liste d'arrêt en définissant ft_stopword_file sur une chaîne vide, car il n'est pas pratique d'y ajouter tout ce qui est spécial.

+0

@bobince: (Re la discussion dans les commentaires ci-dessus, merci d'avoir répondu à cette question facilement compréhensible d'une manière claire.) Sur curiosité, comment feriez-vous avec cette approche? Remplacer chaque mot dans la table auxiliaire avec sa tige? –

+0

Essentiellement oui (traiter les mots dans les requêtes de recherche de la même façon bien sûr). Généralement, vous utiliseriez une librairie de suppression de suffixes existante pour vos langues préférées. (Pour les deux valeurs de 'langage', voir par exemple l'algorithme de Porter pour l'anglais dans de nombreux langages de programmation.) – bobince

0

Habituellement, les caractères échappés sont utilisés dans la requête et non dans les données de la base de données. Essayez d'échapper chaque "+" dans votre requête.

1

De http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

Une phrase qui est entre guillemets double (« " ») caractères correspond uniquement à des lignes contenant l'expression littéralement, comme il a été tapé

Cela signifie que vous. peut rechercher 'C++' en utilisant cette requête:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0
solution

::

changement my.ini

mettre ces deux lignes

ft_min_word_len = "1" 
ft_stopword_file ="" 

ci-dessous

[mysqld] 

que le fichier savve et le serveur mysql restart.

my.ini Le fichier sera partagé par tous. alors pouvons-nous faire des changements dans le fichier my.ini pour certaines sessions seulement?

Questions connexes