2012-04-06 3 views
6

Je suis un peu confus lorsque j'essaie de configurer une recherche en utilisant la recherche fulltext en mode booléen. Voici la requête que je utilise:Recherche plein texte MySQL confusion mode booléen

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

Quand je lance une recherche de +divorce+refinance, les résultats retournés sont:

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

Suis-je raison de penser que le second résultat ne doit pas être son apparition, comme il n'a pas les deux mots? Si non, comment puis-je créer cette fonctionnalité?

Répondre

9

Peut-être que je me trompe, mais si vous recherchez cette chaîne +divorce+refinance vous obtenez un résultat étrange. Si vous voulez rechercher les deux mots, votre recherche de +divorce +refinance (avec un espace entre).

Je l'ai testé et il retourne qu'une seule ligne:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

Votre problème est lié à la créer une requête booléenne en priorité et pour ce type d'une requête doit aller en profondeur de la recherche booléenne et maintenant comment la recherche booléenne est effectuée. En termes simples, laissez-moi vous expliquer pourquoi le résultat du deuxième résultat est affiché.

Une fois devrait d'abord comprendre ce que signifie booléen dans la programmation? Cela signifie que la condition est vraie ou fausse i, e 0 à 1.

Maintenant laissez-moi vous expliquer pour la recherche booléenne est effectuée? Vous avez donné deux mots. Faisons une recherche ligne par ligne en mode booléen. Le moteur de recherche démarre et recherche ligne par ligne maintenant où le premier mot est trouvé, il rend l'enregistrement vrai et attribue un score de 1 aux lignes dans lesquelles le premier mot est trouvé et prépare également le nombre de mots trouvés dans la ligne.

Maintenant, il déplace le mot suivant et fait le même processus donne l'enregistrement True et fait une liste d'enregistrements partout où le mot est trouvé et prépare également le nombre de mots trouvés dans la ligne.

Maintenant, il ya deux lignes de résultats sont disponibles et ils sont clubbed et avec la priorité est donnée aux mots avec le nombre maximum de mots et la rangée est ici le principal problème.

Exemple

Premier >>> nos totaux. >> Deuxième >> total nos. >>> >> finales ligne
Mot >>> Résultats >> Mot >>>> de mots>>> Résultats >> >> Réponse pas


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>> 1. >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1,25 >>>> 3 >>> 1

Bien discothèque deux listes de résultats lorsqu'il est vrai ajouté avec false alors le résultat est vrai, comme si vous ajoutez 1 + 0 = 1 et les résultats sont d avec une valeur supérieure à 1. Donc, tout en marquant la pertinence des mots trouvés, il est toujours constaté que le moteur de recherche affiche les résultats où il a trouvé un mot.

Les requêtes de pertinence de notation sont faites en deux types soit ignorer les scores qui sont égaux à un et seulement faire des calculs sur les enregistrements dont le score est supérieur à 1. Deuxièmement est de faire une requête qu'elle n'affiche jamais les enregistrements égaux à un. Comme dans votre cas, vous pouvez donc les choses ci-dessous aussi pour obtenir les résultats corrects pour deux mots:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

Je sais que l'utilisation du mot ayant fait la requête peu lent, mais il n'y a pas d'autre solution disponible. J'espère que cela résout votre requête.