2009-08-18 5 views
2

Est-il possible d'utiliser les mots-clés CONTAINSTABLE et NOT avec la recherche de texte intégral SQL Server et d'exclure les lignes où une seule colonne contient la valeur à exclure?Utilisation du mot-clé NOT avec recherche de texte intégral et plusieurs colonnes

Par exemple, nous allons prendre la vue indexée suivant (simplifié aux fins d'illustrer ce problème):

ItemId INT 
FirstName VARCHAR(200) 
MiddleName VARCHAR(200) 
LastName VARCHAR(200) 
Address VARCHAR(1000) 
ChildrenNames TEXT 
SearchData TEXT 

SearchData est un champ concaténé généré à partir des autres champs texte/varchar.

Ce point de vue peut être recherché en utilisant la requête suivante pour trouver les lignes qui contiennent prenom mais pas Nom:

SELECT * 
FROM [v_MyView] V 
     LEFT OUTER JOIN CONTAINSTABLE 
     (
      [v_MyView], 
      (
      [FirstName], 
      [MiddleName], 
      [LastName], 
      [Address], 
      [ChildrenName], 
      [SearchData] 
     ), '"name" AND NOT "lastname"') FTS ON [FTS].[Key] = [V].[ItemId] 
WHERE (ISNULL(RANK,0) > 0) 

Cette requête ne semble pas renvoyer les résultats corrects, car il exclut uniquement les lignes si ALL des champs en cours de recherche répondent aux critères, alors qu'il doit exclure ANY lignes qui répondent aux critères.

ie. Les lignes qui contiennent le nom ET lastname dans une colonne (unique) doivent être exclus du jeu de résultats, plutôt que seulement les lignes qui contiennent nom et lastname dans chaque colonne (qui va être improbable). La seule option disponible semble être de vérifier si la requête utilisateur contient des valeurs d'exclusion (par exemple, nom -lastname), et si c'est le cas, limiter la requête à la recherche dans la colonne 'SearchData' uniquement car il s'agit d'une colonne concaténée et contiendra toutes les données. Cependant, cela affectera le classement de pertinence et ne semble pas être une bonne solution.

Répondre

2

J'ai rencontré le même problème, je suppose que c'est un bogue dans le serveur SQL.

Je suppose que quelqu'un a oublié! (A & B & C) ===! A | ! B | Pour l'instant je voudrais créer une nouvelle colonne pour stocker la concaténation de toutes les lignes que vous voulez rechercher, ajouter des déclencheurs pour ajouter tout le texte à votre nouvelle colonne quand les données sont insérées ou mises à jour, et juste rechercher que une nouvelle colonne.

Cela normalise votre table, mais semble se préformer raisonnablement bien.

Questions connexes