我正在尝试查看是否可以以某种方式使用 SQL Server 的全文搜索功能。
我的想法是做类似的事情:取 N 个关键字并搜索所述关键字及其同义词的所有形式。
我想出的是这样的东西:
SELECT *
FROM table
WHERE CONTAINS(*, CONTAINS(*,'FORMSOF(THESAURUS,FORMSOF(INFLECTIONAL,"keyword"))')
但是这个查询不起作用。这甚至可能吗?我的想法是合理的,还是我要疯了?
我正在尝试查看是否可以以某种方式使用 SQL Server 的全文搜索功能。
我的想法是做类似的事情:取 N 个关键字并搜索所述关键字及其同义词的所有形式。
我想出的是这样的东西:
SELECT *
FROM table
WHERE CONTAINS(*, CONTAINS(*,'FORMSOF(THESAURUS,FORMSOF(INFLECTIONAL,"keyword"))')
但是这个查询不起作用。这甚至可能吗?我的想法是合理的,还是我要疯了?
我认为你必须做这样的事情:
Select * from TABLE
Where
CONTAINS(*,'FORMSOF(THESAURUS,"keyword")')
OR
CONTAINS(*,'FORMSOF(INFLECTIONAL,"keyword")')
编辑
否则,您可能必须像这样动态构建 CONTAINS 搜索条件:
IF OBJECT_ID('tempdb..#A') IS NOT NULL DROP TABLE #A
IF OBJECT_ID('tempdb..#B') IS NOT NULL DROP TABLE #B
CREATE TABLE #A (pk INT IDENTITY(1,1), word nvarchar(50))
CREATE TABLE #B (word nvarchar(50))
-- load words from thesaurus
INSERT INTO #A (word)
SELECT display_term
FROM sys.dm_fts_parser('FORMSOF (THESAURUS, "mykeyword")',1033,null,0)
DECLARE @cmd NVARCHAR(1000) , @word NVARCHAR(50);
DECLARE @k INT;SET @k = ISNULL((SELECT MAX(pk) FROM #A) , 0 )
-- call INFLECTIONAL for each word
WHILE @k>0
BEGIN
SELECT @word = word FROM #A WHERE pk = @k
SET @cmd = 'INSERT INTO #B (word)
SELECT display_term
FROM sys.dm_fts_parser(''FORMSOF (INFLECTIONAL, "' + @word + '")'',1033,null,0)'
EXEC(@cmd)
SET @k = @k - 1
END
-- list all words
SELECT * FROM #B
DECLARE @FTString NVARCHAR(4000);
SET @FTString = '';
-- build the list of words for CONTAINS
SELECT @FTString =
@FTString +
+ CASE WHEN @FTString=''
THEN ''
ELSE ' OR '
END
+ '"'+word+'"'
FROM #B
-- display the CONTAINS condition
SELECT @FTString
-- final search
SELECT *
FROM dbo.MyTable AS x
WHERE CONTAINS(*, @FTString)
它可能值得尝试FREETEXT(...)
,而不是CONTAINS(...)
:http ://arcanecode.com/2008/05/27/using-formsof-in-sql-server-full-text-searching/ 。