2008-12-29 7 views
0

Je commence mon incursion dans la recherche de texte intégral pour MSSQL2005. Ceci est une nouvelle base de données in-dev, donc je peux singe avec elle. Disons que j'ai une table "Form" qui a une relation un-à-plusieurs à deux autres tables, "Answer" et "Comment". Je souhaite que l'utilisateur puisse entrer un terme de recherche et qu'il le rattache à chacune des trois tables via la recherche de texte intégral. Quelle est la meilleure façon? Il semble que je puisse créer un indexed view pour accélérer les choses.MSSQL 2005 Configuration de la recherche de texte intégral

Si j'utilise une vue indexée (est-ce le meilleur itinéraire de toute façon?), Comment gérer les relations un-à-plusieurs? Supposons que tout ce que je veux vraiment comprendre est l'ID de la table "Form" qui contiendrait tous les résultats de recherche trouvés dans les tables de réponse/commentaire de l'enfant, donc je peux montrer le formulaire entier qui contient les entrées localisées. Une jointure interne sur la vue entraînerait le retour de plusieurs lignes de formulaire «maître», ce qui ne semble pas très bien pour les performances. Que diriez-vous de concaténer toutes les lignes de réponse/commentaire enfant dans une "colonne" pour la vue? Ainsi, au lieu de ....

Form 1, Answer A, Comment A 
Form 1, Answer B, Comment A 
Form 1, Answer A, Comment B 
Form 1, Answer B, Comment B 

... ce serait ...

Form 1, Answer A Answer B, Comment A Comment B 

Rappelez-vous tout ce que je me soucie de l'ID est de la ligne que maître "forme".

Cela me semble logique, mais je ne suis pas encore sûr des bonnes pratiques concernant la recherche de texte intégral, donc je suis curieux de savoir si je l'approche correctement.

MISE À JOUR: On dirait que les vues indexées sont assez strictes; pas de jointures à gauche, pas de sous-requêtes, donc je pourrais aller dans le chemin d'une table de résumé peuplée de déclencheurs si ça ne va pas être trop lourd.

Répondre

1

Dans SQL, vous devez utiliser cette règle de base: - commencer par l'élément que vous souhaitez récupérer - ajouter des filtres pour limiter l'ensemble des éléments pour récupérer

qui sonne comme une évidence, mais il est vraiment tout ce que vous avez à faire. Ici, vous voulez former des éléments (lignes), de sorte que vous écrivez.

SELECT ID 
FROM Form 

puis vous ajoutez les filtres pour limiter l'ensemble total à l'ensemble des formulaires que vous êtes intéressé à vous le faire en utilisant prédicats IN . Comme vous le dites, Answer et Comment ont une relation 1: n avec Form, cela signifie que Answer et Comment ont un FK à Form.ID. Ainsi, nous pouvons ajouter où:

WHERE ID IN 
(SELECT FormID FROM Answer WHERE CONTAINS(FullTextColumnInAnswer, @stringToSearch)) 
OR 
ID IN 
(SELECT FormID FROM Comment WHERE CONTAINS(FullTextColumnInComment, @stringToSearch)) 

cela conduira à un ensemble de valeurs Form.ID qui sont distinctes et qui sont les ID des formes qui ont au moins 1 réponse ou un commentaire qui contient la chaîne à rechercher dans le champ qui est activé pour la recherche en texte intégral.

Sur SqlServer 2000, cela peut être plus lent qu'en 2005, car vous utilisez plusieurs instructions CONTAINS.

Vous pouvez également utiliser CONTAINSTABLE() dans les scénarios de jointure, voir la BOL pour des exemples, même si je vais d'abord utiliser la configuration de la clause IN pour que les choses fonctionnent.

+0

Je pense peut-être que je souffre d'un cas d'optimisation prématurée, donc je pense que je vais courir avec les choses simples comme ça d'abord et voir où cela me mène. – Chris

Questions connexes