2011-10-03 3 views
1

Je crée un système de type FAQ en ligne en utilisant php et mySQL. Le SQL suivant est ce qui est utilisé pour trouver des questions pertinentes en fonction de ce que l'utilisateur a entré comme $term. Lorsqu'un utilisateur recherche quelque chose et clique sur une question pertinente pour afficher la réponse, il a la possibilité d'évaluer la question en fonction de ce qu'il a recherché.mySQL fulltext apprentissage

La première partie du SQL obtient des ID de question pertinents à partir de la table de questions réelle. La deuxième partie se penche sur la table de classement et essaie de faire correspondre ce que les gens ont déjà recherché pour trouver des ID de questions pertinentes.

L'union de ces résultats est ensuite utilisée pour obtenir les titres des questions réelles stockées dans la base de données.

(SELECT id_question, 
MATCH(question, tags) AGAINST ('%$term%') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('%$term%') 
AND category = '$category') 

UNION 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('%$term%') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('%$term%') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

Le problème que je rencontre est que le système n'apprend pas vraiment correctement. Par exemple, si je tape "trois utilisateurs", le système trouvera une correspondance dans la table des questions.

Si je tape "3 utilisateurs", le système trouvera une correspondance dans le tableau des questions (basé sur le mot-clé "utilisateurs"). Si je clique sur "oui cela répond à ma question" il va stocker "3 utilisateurs" dans le tableau de classement en l'associant à la question "trois utilisateurs".

Le problème est que "3" n'est associé qu'à "trois utilisateurs". Est-il possible d'associer le numéro 3 dans ce cas à chaque instance du mot "trois".

+0

signifie que vous voulez remplacer toutes les instances d'un ancien mot (trois) par donné mot (3). J'ai-je raison? – diEcho

Répondre

1

Vous n'utilisez pas de caractères génériques dans match against en mode langage naturel (la valeur par défaut).

Utilisez cette requête à la place:

(SELECT id_question, 
MATCH(question, tags) AGAINST ('$term') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('$term') 
AND category = '$category') 

UNION ALL <<-- faster than UNION. 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('$term') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('$term') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

Vous pouvez utiliser les modificateurs de recherche in boolean mode.

De même, ne pas rechercher les mots vides et les mots de moins de 4 caractères.
Vous lorsque vous utilisez $term = "3 users", MySQL recherchera seulement users et ignorera le 3.

Si vous souhaitez rechercher 3 vous devrez revenir à LIKE '% 3 %'

Voir:
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html