J'essaie de construire un petit moteur de recherche d'exercices en utilisant mysql. Chaque exercice peut avoir un nombre arbitraire de balises de recherche.Besoin d'aide avec SQL pour le classement des résultats de recherche
Voici ma structure de données:
TABLE exercises
ID
title
TABLE searchtags
ID
title
TABLE exerciseSearchtags
exerciseID -> exercises.ID
searchtagID -> searchtags.ID
... où exerciseSearchtags est plusieurs à plusieurs table de jointure exprimant la relation entre les exercices et searchtags.
Le moteur de recherche accepte un nombre inconnu de mots-clés entrés par l'utilisateur. Je souhaite classer les résultats de la recherche en fonction du nombre de correspondances mot-clé/recherche.
Voici le sql que j'utilise actuellement pour sélectionner des exercices. Les règles CASE et les règles WHERE sont générées dynamiquement, une pour chaque mot clé. Par exemple, si un utilisateur entre 3 mots-clés, il y aura 3 règles CASE et 3 règles WHERE.
SELECT
exercises.ID AS ID,
exercises.title AS title,
(
(CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)+
(CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)+
...etc...
(CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)
) AS relevance
FROM
exercises
LEFT JOIN exerciseSearchtags
ON exerciseSearchtags.exerciseID = exercises.ID
LEFT JOIN searchtags
ON searchtags.ID = exerciseSearchtags.searchtagID
WHERE
searchtags.title LIKE CONCAT('%',?,'%') OR
searchtags.title LIKE CONCAT('%',?,'%') OR
...etc...
searchtags.title LIKE CONCAT('%',?,'%')
GROUP BY
exercises.ID
ORDER BY
relevance DESC
Cette presque œuvres. Cependant, les résultats ne sont pas classés dans l'ordre auquel je m'attendrais.
Ma meilleure idée de la raison pour laquelle cela se produit, c'est que le score de pertinence est calculé AVANT que les lignes ne soient groupées par exercise.ID. Ainsi, si la jointure gauche fait apparaître un exercice particulier 10 fois dans le jeu de résultats et un autre exercice 4 fois, le premier exercice peut obtenir un score de pertinence plus élevé, même s'il ne contient pas plus de correspondances mot clé/recherche.
Est-ce que quelqu'un a des suggestions/conseils sur la façon dont je peux éviter que cela se produise/résoudre ce problème?
Merci d'avance pour votre aide.
merci pour la suggestion. J'ai essayé de coder en dur les règles CASE dans l'instruction ORDER BY, mais malheureusement cela n'a pas changé l'ordre des résultats. Donc je suppose que cela est aussi calculé avant que les lignes ne soient groupées dans mysql – Travis
Ah bien; Dommage, j'ai vérifié mon code juste au cas où il y avait quelque chose d'autre que j'ai fait pour le faire fonctionner mais c'était tout. Bonne chance! :) –