TSQL - объединение с использованием полнотекстового содержимого - PullRequest
3 голосов
/ 01 марта 2011

В настоящее время у меня есть следующий оператор выбора, но я хочу перейти к полнотекстовому поиску в столбце Ключевые слова.Как мне переписать это, чтобы использовать CONTAINS?

SELECT MediaID, 50 AS Weighting
FROM Media m JOIN @words w ON m.Keywords LIKE '%' + w.Word + '%'

@ words - это переменная таблицы, заполненная словами, которые я хочу найти:

DECLARE @words TABLE(Word NVARCHAR(512) NOT NULL);

Ответы [ 2 ]

4 голосов
/ 09 мая 2012

Если вы не против использования временной таблицы и EXEC (и я понимаю, что это большое, если), вы можете сделать следующее:

DECLARE @KeywordList VARCHAR(MAX), @KeywordQuery VARCHAR(MAX)
SELECT @KeywordList = STUFF ((
        SELECT '"' + Keyword + '" OR '
        FROM FTS_Keywords
        FOR XML PATH('')
    ), 1, 0, '')

SELECT  @KeywordList = SUBSTRING(@KeywordList, 0, LEN(@KeywordList) - 2)
SELECT  @KeywordQuery = 'SELECT RecordID, Document FROM FTS_Demo_2 WHERE CONTAINS(Document, ''' + @KeywordList +''')'

--SELECT @KeywordList, @KeywordQuery

CREATE TABLE #Results (RecordID INT, Document NVARCHAR(MAX))

INSERT INTO #Results (RecordID, Document)
EXEC(@KeywordQuery)

SELECT * FROM #Results

DROP TABLE #Results

Это сгенерирует запрос вроде:

SELECT   RecordID
        ,Document 
FROM    FTS_Demo_2 
WHERE CONTAINS(Document, '"red" OR "green" OR "blue"')

И такие результаты:

RecordID    Document
1   one two blue
2   three red five
2 голосов
/ 01 марта 2011

Если CONTAINS допускает переменную или столбец, вы могли бы использовать как-то так.

SELECT MediaID, 50 AS Weighting
FROM Media m
JOIN @words w ON CONTAINS(m.Keywords, w.word)

Однако, согласно Books Online для SQL Server СОДЕРЖИТ , это не поддерживается.Поэтому нет никакого способа сделать это.

Ссылка: (имя_ столбца появляется только в первом параметре СОДЕРЖИТ)

CONTAINS
( { column_name | ( column_list ) | * } 
  ,'<contains_search_condition>'     
[ , LANGUAGE language_term ]
) 
...