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.