2010-09-28 11 views
0

Actuellement au milieu de la construction d'une application de base de connaissances et je suis un peu incertain sur la meilleure façon de stocker et d'indexer les informations du document. L'utilisateur télécharge le document et, ce faisant, sélectionne un certain nombre d'options dans les listes déroulantes (telles que catégorie, sujet, zone ..., notez que celles-ci ne sont pas toutes obligatoires), il saisit également des mots-clés et une description du document. Pour le moment, la catégorie (et les autres) sélectionnées est stockée en tant que clé étrangère dans la table des documents en utilisant l'identifiant du tableau des catégories. Ce que nous voulons être en mesure de faire est de faire un FREETEXTTABLE ou CONTAINSTABLE non seulement les informations dans la colonne varchar (max) où se trouve le document, mais aussi sur le nom de la catégorie, le nom du sujet et le nom de la zone. J'ai regardé l'option de créer une vue indexée, mais cela n'a pas été possible en raison de la LEFT JOIN par rapport à la colonne catégorie. Donc, je ne suis pas sûr de savoir comment faire cela, des idées seraient les plus appréciées.Recherche plein texte sur des documents et des données connexes mssql

Répondre

0

Je suppose que vous voulez ET les deux recherches ensemble. Par exemple trouver tous les documents contenant le texte "foo" ET dans la catégorie "Réparation automobile".

Peut-être vous n'avez pas besoin de texte intégral les données supplémentaires et pouvez simplement utiliser = ou comme? Si les données supplémentaires sont raisonnablement petites, elles peuvent ne pas justifier la complication du texte intégral. Toutefois, si vous souhaitez utiliser le texte intégral sur les deux, utilisez une procédure stockée qui rassemble les résultats pour vous. L'astuce ici est de mettre en scène les résultats plutôt que d'essayer d'obtenir un résultat tout de suite.

Ceci est un point de départ approximatif.

-- a staging table variable for the document results 
declare @documentResults table (
    Id int,  
    Rank int 
) 

insert into @documentResults 
select d.Id, results.[rank] 
from containstable (documents, (text), '"foo*"') results 
inner join documents d on results.[key] = d.Id 

-- now you have all of the primary keys that match the search criteria 
-- whittle this list down to only include keys that are in the correct categories 

-- a staging table variable for each the metadata results 
declare @categories table (
    Id int   
) 

insert into @categories 
select results.[KEY] 
from containstable (Categories, (Category), '"Automotive Repair*"') results 

declare @topics table (
    Id int   
) 

insert into @topics 
select results.[KEY] 
from containstable (Topics, (Topic), '"Automotive Repair*"') results 

declare @areas table (
    Id int   
) 

insert into @areas 
select results.[KEY] 
from containstable (Areas, (Area), '"Automotive Repair*"') results 


select d.text, c.category, t.topic, a.area 
from @results r 
inner join documents d on d.Id = r.Id 
inner join @categories c on c.Id = d.CategoryId 
inner join @topics t on t.Id = d.TopicId 
inner join @areas a on a.Id = d.AreaId 
0

Vous pouvez créer une nouvelle colonne pour votre index de texte intégral qui contiendrait le document original plus les catégories ajoutées en tant que métadonnées. Ensuite, une recherche sur cette colonne pourrait rechercher à la fois le document et les catégories simultanément. Vous auriez besoin d'inventer un système de marquage qui les garderait uniques dans votre document, mais les étiquettes ne seraient pas susceptibles d'être utilisées comme des expressions de recherche elles-mêmes. Peut-être quelque chose comme:

This is my regular document text. <FTCategory: Automotive Repair> <FTCategory: Transmissions> 
+0

Comme toujours, je ne me dérange pas un vote négatif si je me trompe. Cependant, je n'aime pas un vote anonyme sans explication. Pouvez-vous expliquer votre objection? –

+0

Je ne stocke pas les mêmes données deux fois est une façon acceptable de doubler la taille de chaque document dans la base de données – Gazeth

+0

+1 - C'est une solution réaliste que l'OP le réalise ou non. – JNK