2011-07-08 2 views
0

J'ai une table (Catalogue) avec une colonne (Titre). Cette colonne stocke des informations sur une chanson (artiste, titre, remix). J'ai une situation où j'ai besoin de trouver des correspondances à partir d'un terme de recherche.SQL Server Texte intégral Rechercher un dilemme

J'ai activé SQL Server FTS et créé un catalogue FTS en utilisant la colonne Titre. J'ai commencé à tester en utilisant FREETEXTTABLE où je passe dans le terme de recherche.

J'ai trouvé que cela renvoyait à de nombreux résultats non pertinents bien que les résultats les mieux classés soient généralement corrects SI le titre existe dans la table Catalogue. Une approche que j'avais était de convertir le RANK en pourcentage et seulement afficher les résultats où le pourcentage est supérieur à 90. Le problème est que la requête renvoie toujours des résultats non pertinents si le titre n'existe pas dans la table catalogue.

L'alternative est d'utiliser CONTAINSTABLE. Le problème est ici que je dois générer dynamiquement la requête dans le code (décomposer les mots) créer quelque chose comme:

SELECT DISTINCT ft.[rank], [Id] 
FROM CONTAINSTABLE(Catalogs, Title, '"artist" AND "title" AND "remix"') AS ft 
JOIN [Catalogs] ON [Catalogs].[Id] = ft.[KEY] 

Le dilemme est qu'il n'y a pas de séparateurs dans le terme de recherche. Cela signifie que je ne peux pas séparer logiquement la chaîne en artiste et en titre, mais plutôt en mots. Parfois, d'autres termes sont inclus comme label, ce qui entraînera l'échec de la requête ci-dessus.

Je suis un peu coincé. Est-ce que quelqu'un a traité un problème similaire en utilisant SQL Server FTS? Y a-t-il une approche entre CONTAINSTABLE et FREETEXTTABLE?

Répondre

3

Nous avons rencontré un problème similaire lorsque les utilisateurs pouvaient entrer une chaîne de recherche de requête gratuite, mais que nous devions utiliser CONTAINS car FREETEXT renvoyait trop de faux positifs. Nous avons fini par écrire notre propre routine d'analyse de terme de recherche sur la couche de gestion qui nettoie la chaîne et remplace tous les espaces par AND. Cela doit bien sûr être assez intelligent pour permettre le regroupement logique (lorsque les gens utilisent des parenthèses) et plusieurs espaces. Cela semble bien fonctionner pour nous.

Je suis un peu curieux de la structure des données dans votre colonne. Si l'artiste, le titre et le remix sont des éléments d'information vraiment indépendants, ne serait-il pas logique de les maintenir comme des colonnes distinctes et de les interroger individuellement?

Questions connexes