2009-03-05 6 views
5

Je cherche la solution optimale pour la correspondance de mots-clés entre différents enregistrements dans la base de données. C'est un problème classique, j'ai trouvé des questions similaires, mais rien de concret. Je l'ai fait avec des recherches de texte intégral, des jointures et des sous-requêtes, des tables temporaires, ... alors j'aimerais vraiment voir comment vous résolvez un problème si commun. Donc, disons que j'ai deux tables; Products et Keywords et ils sont liés à la troisième table, Products_Keywords dans une relation many-to-many classique.Quelle est la solution optimale pour l'appariement de mots-clés?

Si je montre un Product enregistrement sur la page et je voudrais montrer haut n produits connexes, ce qui serait la meilleure option?

Nous devrions tenir compte du fait que les enregistrements peuvent partager plusieurs mots-clés, ce qui devrait déterminer la commande du produit connexe le plus important.

Je suis ouvert à d'autres idées aussi, mais T-SQL serait une solution préférable pour des raisons de performances.

+0

Alerte de pédanterie: quelque chose ne peut pas être «optimal». C'est soit optimal, aussi connu comme «meilleur», ou ce n'est pas le cas. ;-) – nekomatic

+0

Je suis corrigé :) – muerte

Répondre

0

Eh bien peut-être quelque chose comme le follwing:

select p.productId, p.name, r.rank 
from products p inner join (
/* this inner select should bring in only products that have at least one keyword 
=> shared with the requested product, and will count the actual number shared (for ranking)*/ 
    select related.productId, count(related.productId) as rank 
    from 
     products_keywords related inner join 
     products_keywords pk ON (pk.productId = @productId AND related.keywordId = pk.keywordId) 
    where related.productId <> @productId 
    group by related.productId 
) r on p.productId = r.productId 
order by r.rank DESC /* added DESC (not in orignal solution, but needed to put higher ranked on top)*/ 

Maintenant, je doute sérieusement qui est une instruction sql optimale, mais il doit faire le travail. Je ne peux pas le vérifier cependant depuis que je l'ai juste écrit à partir de zéro avec aucune table de support réelle, ou des données à tester contre.

+0

si vous voulez des mots-clés pondérés pour ci-dessus et vous choisissez vos poids pour être un nombre entre 0> x> = 1, vous pouvez définir le rang à (count (related.productId) * (somme (pk.weight)/sum (pk.poids) + 1)) comme rang ou [C * (w/w + 1) = rang] où C est le nombre et w est le poids additionné. –

3

Mon premier coup serait quelque chose comme:

SELECT 
    P.product_id, 
    COUNT(*) 
FROM 
    Product_Keywords PK1 
INNER JOIN Product_Keywords PK2 ON 
    PK2.keyword_id = PK1.keyword_id 
INNER JOIN Products P ON 
    P.product_id = PK.product_id 
WHERE 
    PK1.product_id = @product_id 
GROUP BY 
    P.product_id 
ORDER BY 
    COUNT(*) DESC 

La jonction de Product_Keywords à Product_Keywords (PQ2 à PK1) pourrait être difficile, donc je ne peux pas parler à la performance. C'est là que je voudrais commencer et ensuite regarder l'optimisation. Une chose à considérer, à la suite du commentaire d'Assaf, est que vous pourriez ajouter un "poids" aux mots-clés Product_Keywords et SUM (PK1.weight) + SUM (PK2.weight) pour le classement. Juste une pensée.

EDIT: Pour élaborer sur la pondération ... vous pouvez décider d'autoriser la pondération des mots-clés. La méthode utilisée pour déterminer la pondération serait une décision d'affaires, donc je ne peux pas vraiment vous donner trop de conseils là-bas. Mais à titre d'exemple, cette question concerne la "programmation", la "correspondance des mots clés" et le "SQL". La programmation est assez générique, donc si deux questions avaient cela en commun cela ne signifierait peut-être pas qu'elles sont liées, donc peut-être que vous ne le ferez que 1. Le SQL est un peu plus spécifique, de sorte que vous pourriez peser 5. est à la fois l'objet principal de la question ET il est assez spécifique, de sorte que vous pouvez peser avec un 10.

Ceci est juste un exemple bien sûr et comme je l'ai dit, la détermination exacte des poids ainsi que la façon dont vous marquez il dépend de l'entreprise spécifique. Vous pourriez décider que l'appariement du nombre de mots-clés est plus important que le poids, alors peut-être que la pondération est utilisée uniquement comme un départage, etc. HTH.

+0

Pouvez-vous nous en dire un peu plus sur le concept de poids? Comment devrais-je peser les mots-clés? – muerte