2010-04-20 5 views
0

Je suis très noob en ce qui concerne la recherche en texte intégral et on m'a dit de faire une recherche en texte intégral sur 2 tableaux et de trier les résultats par pertinence.Recherche plein texte impliquant 2 tables

Je vais regarder sur la table "Posts" et la table "PostComments". Je dois chercher le terme de recherche (disons "AnyWord") sur Posts.Description, Posts.Title et PostComments.Comments.

Je dois retourner les messages classés par pertinence, mais puisque je suis à la recherche sur les postes et PostComments je ne sais pas si cela a un sens. Je dirais que j'ai besoin de toutes les informations sur la même table pour trier par pertinence.

Pourriez-vous m'aider à comprendre si cela a du sens et si elle parvient à le réaliser?

EDIT

Je vais essayer d'expliquer un peu mieux ce que je dois. Un message est pertinent pour la recherche si le terme recherché est présent sur le titre, sur la description ou sur l'un des PostComments connexes.

Mais sur le frontal, je vais montrer une liste de poste. Le titre de l'article sur cette liste est un lien vers le message lui-même. Les commentaires de publication sont visibles ici mais pas dans la liste des résultats de recherche, bien qu'ils soient impliqués dans le processus de recherche.

Donc, vous pourriez avoir messages sur le résultat de recherche qui correspondent juste parce que le terme de recherche est présent sur un ou plusieurs commentaires

Répondre

1

Seuls ContainsTable renvoie une évaluation de la pertinence. Vous n'avez pas indiqué ce qui devait être retourné, donc j'ai simplement renvoyé le nom de la table d'où est stockée la valeur avec la clé primaire de la table (remplacez "PrimaryKey" par votre nom de colonne de clé primaire, par exemple PostId ou PostCommentsId) , la valeur et son rang.

Select Z.TableName, Z.PK, Z.Value, Z.Rank 
From (
     Select 'Posts' As TableName, Posts.PrimaryKey As PK, Posts.Description As Value, CT.Rank 
     From Posts 
      Join ContainsTable(Posts, Description, 'Anyword') As CT 
       On CT.Key = Posts.PrimaryKey 
     Union All 
     Select 'PostComments', PostComments.PrimaryKey, PostComments.Comments, CT.Rank 
     From PostComments 
     Join ContainsTable(PostComments, Comments, 'Anyword') As CT 
       On CT.Key = PostComments.PrimaryKey 
     ) As Z 
Order By Z.Rank Desc 

EDIT Compte tenu des informations supplémentaires, il est beaucoup plus claire. Premièrement, il semblerait que le classement de la recherche n'a aucune incidence sur les résultats. Donc, tout ce qui est nécessaire est d'utiliser un OU entre la recherche sur l'information de poste et la recherche sur PostComments:

Select ... 
From Posts 
Where Contains(Posts.Description, Posts.Title, 'searchterm') 
    Or Exists (
       Select 1 
       From PostComments 
       Where PostComments.PostId = Posts.Id 
        And Contains(PostComments.Comments, 'searchterm') 
       ) 
+0

@Thomas, merci pour votre aide! Peut-être que je n'étais pas assez clair mais la recherche doit retourner POSTS. Le résultat sera affiché dans une liste d'ordre POSTS par pertinence. – StackOverflower

+0

@Timmy O 'Tool - Alors, comment PostComments s'intègre-t-il dans l'équation? En quoi les Posts et PostComments sont-ils liés? – Thomas

+0

@Timmy O 'Tool - Comment les classements sur les valeurs trouvées dans PostComments s'intègrent-ils dans le problème? Cela aiderait si vous pouviez montrer un exemple de ce que vous attendiez. – Thomas