2010-08-07 16 views
7

sto usando la query di seguito per restituire i risultati da una tabella utilizzando full-text-Search. In SQL2000 era possibile solo per cercare una o tutte le colonne di una tabella. È possibile in SQL 2008?SQL Server full-text-Search FREETEXTTABLE ricerca più colonne

vorrei cercare due tabelle, Problema e soluzione (sia indicizzato e nella stessa tabella):

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; 

Da quello che posso vedere la FREETEXTTABLE non accetta più di una colonna?

risposta

12

Li specificato tra parentesi; FREETEXTTABLE(tablename, (col1,col2,col3), 'expr') o utilizzare un asterisco per filtrare tutte le colonne dell'indice.

+1

L'asterisco non danneggia le prestazioni, se usato senza discrezione? – Tobiasopdenbrouw

+1

Sì, se v'è una colonna nell'indice che non si cura di. –

0

From MSDN,

restituisce una tabella di zero, uno, o più righe per le colonne contenenti tipi di dati basati su caratteri per i valori che corrispondono al significato, ma non il testo esatto, del testo nella specificato freetext_string. FREETEXTTABLE può essere fatto riferimento nella clausola FROM di un'istruzione SELECT come un normale nome di tabella. query che utilizzano FREETEXTTABLE specificare FREETEXT tipo query full-text che restituiscono un valore di rilevanza classifica (RANK) e la chiave full-text (KEY) per ogni riga.

danno la seguente sintassi:

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

Quindi sì, che cosa ha detto Alex K. pure.

0

Se è stato creato un INDICE FULLTEXT su colonne diverse, è possibile utilizzare CONTAINS o FREETEXT per visualizzarne uno, tutti o alcuni di essi. In questo modo:

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); 

Se si desidera specificare le colonne che si desidera cercare. Se hai bisogno dei risultati in una colonna, dovrai fare un UNION e fare una ricerca per ogni colonna che vuoi cercare.

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

come potrei fare se ho bisogno solo una parte della parola, ma ancora visualizzerà la parola completa? Come se il valore di ricerca fosse 'Curt', il risultato della ricerca sarebbe' Curtain, Curtis, Curtman ... ' – Rich