2010-11-01 6 views
2

Les deux requêtes suivantes renvoient le même (attendu) résultat lorsque je fais une recherche ma base de données:MATCH MySQL ... AGAINST trouve parfois réponse, ne parfois pas

SELECT * FROM articles 
WHERE content LIKE '%Euskaldunak%' 

SELECT * FROM articles 
WHERE MATCH (content) AGAINST ('+"Euskaldunak"' IN BOOLEAN MODE) 

Le texte dans le champ contenu qu'il recherche est ressemble à ceci: « ... Ces Euskaldunak, ou les nouveaux venus ... »

Cependant, la requête suivante sur la même table renvoie le seul résultat attendu:

SELECT * FROM articles 
WHERE content LIKE '%PCC%' 

et la requête suivante renvoie une résultat vide:

SELECT * FROM articles 
WHERE MATCH (content) AGAINST ('+"PCC"' IN BOOLEAN MODE) 

Le texte dans le champ de contenu qui correspond à ce résultat ressemble à ceci: « ... Portland Community College (PCC) est le plus grand ... »

je ne peux pas pourquoi chercher "Euskaldunak" fonctionne avec cette syntaxe MATCH ... AGAINST mais pas "PCC". Est-ce que quelqu'un voit quelque chose que je ne vois pas?

(aussi:. « PCC » n'est pas une expression commune dans ce domaine - pas d'autres lignes contiennent le mot, de sorte que la recherche en langage naturel ne doit pas être exclure)

Répondre

3

Votre longueur de mot minimale en texte intégral est probablement trop élevée. Je pense que la valeur par défaut est 4, ce qui expliquerait ce que vous voyez. Réglez-le sur 1 si vous voulez que tous les mots soient indexés quelle que soit la longueur.

exécuter cette requête:

show variables like 'ft_min_word_len'; 

Si les valeurs est supérieure à 3 et que vous voulez obtenir hits de mots plus courts que, éditer votre /etc/my.cnf et ajouter ou mettre à jour cette ligne dans le section [mysqld] en utilisant une valeur appropriée pour votre application:

ft_min_word_len = 1 

redémarrez ensuite MySQL et reconstruire vos index de texte intégral et vous devriez être tous ensemble.

+0

C'est ici! Malheureusement, je ne peux pas changer la variable moi-même, je dois demander qu'elle soit modifiée, donc je n'ai pas encore essayé la solution. Mais le réglage est, en fait, réglé à 4, pas à 3. – Elizabeth

3

Il y a deux choses que je peux penser de suite. La première est que votre valeur ft_min_word_len est définie sur plus de 3 caractères. Tout "mot" inférieur à la longueur ft_min_word_len ne sera pas indexé. La seconde est que plus de 50% de vos enregistrements contiennent la chaîne 'PCC'. Une recherche en texte intégral correspondant à plus de 50% des enregistrements est considérée comme non pertinente et ne renvoie rien.

Les index de texte complet ont des règles différentes de celles des index de chaînes ordinaires. Par exemple, il y a une liste de mots vides, donc certains mots communs comme to, the, et, ne sont pas indexés.