2010-08-07 4 views
7

J'utilise la requête ci-dessous pour retourner les résultats d'une table en utilisant la recherche de texte intégral. Dans SQL2000, il était uniquement possible de rechercher une ou toutes les colonnes d'une table. Est-ce possible dans SQL 2008?Recherche de texte intégral dans SQL Server FREETEXTTABLE recherche dans plusieurs colonnes

Je voudrais rechercher deux tables, Problème et solution (et dans les deux indexés de la même table):

DECLARE @topRank int set @topRank=(SELECT MAX(RANK) 
FROM FREETEXTTABLE([Support_Calls], Problem, 'test', 1)) 
SELECT [ID] AS [Call No],Company_Name, Problem, Solution, CONVERT(VARCHAR(20),CAST((CAST(ftt.RANK as DECIMAL)/@topRank * 100) AS DECIMAL(13,0))) + '%' as Match 
FROM [Support_Calls] INNER JOIN FREETEXTTABLE([Support_Calls], Problem, 'test') as ftt ON ftt.[KEY]=[ID] ORDER BY ftt.RANK DESC; 

D'après ce que je peux voir la FREETEXTTABLE n'accepte pas plus d'une colonne?

Répondre

12

Vous les spécifiez entre parenthèses; FREETEXTTABLE(tablename, (col1,col2,col3), 'expr') ou utilisez un astérisque pour rechercher toutes les colonnes de l'index.

+1

L'astérisque ne nuira pas à la performance, cependant, s'il est utilisé sans discrétion? – Tobiasopdenbrouw

+1

Oui, en effet, s'il y a une colonne dans l'index qui ne vous intéresse pas. –

0

From MSDN,

Renvoie une table de zéro, un, ou plusieurs lignes pour les colonnes contenant des types de données à base de caractères pour les valeurs qui correspondent au sens, mais pas le libellé exact, du texte spécifié chaîne_freetext. FREETEXTTABLE peut uniquement être référencé dans la clause FROM d'une instruction SELECT comme un nom de table normal. Les requêtes utilisant FREETEXTTABLE spécifient des requêtes de texte intégral de type texte qui renvoient une valeur de classement de pertinence (RANK) et une clé de texte intégral (KEY) pour chaque ligne.

Ils donnent la syntaxe suivante:

FREETEXTTABLE (table , { column_name | (column_list) | * } 
      ,'freetext_string' 
    [ , LANGUAGE language_term ] 
    [ ,top_n_by_rank ]) 

Alors oui, ce que Alex K. dit ainsi.

0

Si vous avez créé un index FULLTEXT sur différentes colonnes, vous pouvez simplement utiliser CONTAINS ou FREETEXT pour voir l'un d'entre eux, tous ou certains d'entre eux. Comme ceci:

SELECT * 
FROM YourTable 
WHERE CONTAINS(*, @SearchTerm); 

If you want to look on all the columns that are included in the FULLTEXT INDEX. or: 

SELECT * 
FROM YourTable 
WHERE CONTAINS((ProductName, ProductNumber, Color), @SearchTerm); 

Si vous souhaitez spécifier les colonnes que vous souhaitez rechercher. Si vous avez besoin des résultats dans une colonne, vous devrez faire un UNION et faire une recherche pour chaque colonne que vous voulez rechercher.

SELECT * 
FROM YourTable 
WHERE CONTAINS(ProductName, @SearchTerm) 
UNION 
SELECT * 
FROM YourTable 
WHERE CONTAINS(ProductNumber, @SearchTerm) 
UNION 
SELECT * 
FROM YourTable 
WHERE CONTAINS(Color, @SearchTerm) 
+1

Comment ferais-je si j'ai besoin seulement d'une partie du mot mais montrera toujours le plein mot? Comme si la valeur de recherche est 'Curt', le résultat de la recherche serait' Curtain, Curtis, Curtman ... ' – Rich

Questions connexes