2012-02-27 124 views
3

我在嘗試查看SQL Server的全文本搜索功能是否可以以某種方式使用。FORMSOF可以嵌套嗎?

我的想法是做類似這樣的事情:取N個關鍵字並搜索所有關鍵字及其同義詞的形式。

我想出了爲這些方針的東西:

SELECT * 
FROM table 
WHERE CONTAINS(*, CONTAINS(*,'FORMSOF(THESAURUS,FORMSOF(INFLECTIONAL,"keyword"))') 

但此查詢不起作用。 這甚至可能嗎? 我的想法是否合理,還是會發瘋?

回答

1

我認爲你必須做這樣的事情:

Select * from TABLE 
Where 
    CONTAINS(*,'FORMSOF(THESAURUS,"keyword")') 
    OR 
    CONTAINS(*,'FORMSOF(INFLECTIONAL,"keyword")') 

編輯

否則,您可能需要動態地構建包含這樣的搜索條件:

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) 
+0

呀,這看起來正確的,但如果我是像顛倒的順序: FORMSOF(INFLECIONAL,FORMSOF(詞庫,「字」)) 也許結果會是不同的,不是嗎? – Tejo 2012-02-27 14:01:18

+0

@Tejo - 這將是一個不同的問題:)我從來沒有見過像這樣使用FORMSOF。我發現全文搜索非常非常嚴格和限制。 – leoinfo 2012-02-27 14:39:43

+0

好的,謝謝你的提示,我有點新東西,這就是爲什麼我想知道:) – Tejo 2012-02-27 15:31:12