【问题标题】:Sql server full text search for a list of wordssql server全文搜索单词列表
【发布时间】:2019-02-18 11:46:56
【问题描述】:

我正在为 sql server 全文搜索功能的表达式语法而苦苦挣扎。

我有一个需要在我的表格列中找到的用户“单词”列表:

SELECT DocumentNode, DocumentSummary  
FROM Production.Document  
WHERE CONTAINS(DocumentSummary, '"word1" OR "word2"') 

对于 x 数单词的列表,是否有有效的方法来执行此操作? 比:

'"word1" OR "word2" ... OR "wordx"'

更新: 让我澄清一下,我的表(例如,Production.Document)有几百万条记录,所以我需要查询来获得最佳性能。此外,查询可能每天执行数千次。我写这篇文章是为了解释为什么 LIKE 查询不是一个选项。

PS:如果我缺少任何替代方法(全文搜索除外),请告知。

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    使用 CONTAINS 无法做到这一点,因为 CONTAINS 仅将列作为第一个参数而不是第二个参数。但是,您可以将您的话放在一个表格中,然后使用动态 sql 来执行您的查询:

    Declare @WordTable table
         (Id int primary key,
          Word varchar(25))
    
    Insert @WordTable values (1, 'word1')
    Insert @WordTable values (2, 'word2')
    Insert @WordTable values (3, 'word3')
    
    DECLARE @Words VARCHAR(MAX)
    
    SELECT @Words = STUFF ((
            SELECT '"' + Word + '" OR '
            FROM @WordTable
            FOR XML PATH('')
        ), 1, 0, '')
    
    --drop the last OR
      SELECT  @Words = SUBSTRING(@Words, 0, LEN(@Words) - 2)
    
      DECLARE @Query VARCHAR(MAX)
      SELECT  @Query = 'SELECT DocumentNode, DocumentSummary  
                        FROM Production.Document  
                        WHERE CONTAINS(DocumentSummary, ''' + @Words +''')'
    
      EXEC(@Query)
    

    【讨论】:

      【解决方案2】:

      如果您需要查找列表中的所有单词,请使用“LIKE”运算符,如下所示:

      SELECT Document.Node, Document.Summary
      FROM Production.Document
      WHERE Document.Summary LIKE '%word1%'
        AND Document.Summary LIKE '%word2%'
      

      另一方面,如果您需要在列表中查找 任何 单词,只需将逻辑运算更改为 OR。希望,它会有所帮助:)

      【讨论】:

      • 谢谢约翰,但我需要避免“LIKE”,因为我的表将有几百万条记录,所以这将非常昂贵。我会更新我的问题以明确..
      猜你喜欢
      • 2013-05-29
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多