【问题标题】:Can FORMSOF be nested?FORMSOF 可以嵌套吗?
【发布时间】:2012-03-16 23:31:06
【问题描述】:

我正在尝试查看是否可以以某种方式使用 SQL Server 的全文搜索功能。

我的想法是做这样的事情:取N个关键字并搜索所述关键字的所有形式及其同义词。

我的想法是这样的:

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

但是这个查询不起作用。 这甚至可能吗? 我的想法是合理的,还是我要疯了?

【问题讨论】:

    标签: sql-server full-text-search formsof


    【解决方案1】:

    我认为你必须这样做:

    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)
    

    【讨论】:

    • 是的,这看起来是对的,但是如果我要颠倒顺序,例如:FORMSOF(INFLECIONAL,FORMSOF(THESAURUS, "word")),结果可能会有所不同,不是吗?
    • @Tejo - 那将是一个不同的问题 :) 我从未见过这样使用 FORMSOF。我发现全文搜索非常、非常严格和限制性。
    • 好的,谢谢你的提示,我对这个东西有点陌生,这就是我想知道的原因:)
    【解决方案2】:

    可能值得尝试FREETEXT(...) 而不是CONTAINS(...)http://arcanecode.com/2008/05/27/using-formsof-in-sql-server-full-text-searching/

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2012-01-12
      • 2010-10-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多