【问题标题】:Full text search for MS SQLMS SQL 的全文搜索
【发布时间】:2015-03-02 15:41:32
【问题描述】:

我有一个存储用户输入的搜索条件的数据库,我想分析某些词的使用频率。 “问题”是许多搜索具有相似的含义,但伴随着一个或多个单词。例子(在这个例子中“foo”是一个有趣的词):

bar
foo 2015
show me foo
germany foo

我想确定foo 被使用了 3 次。我需要以编程方式执行此操作,这意味着使用 SQL 命令将是理想的解决方案。使用的词因用户行为而异。因此,我事先不知道使用了哪些词,我需要逻辑自行确定。

【问题讨论】:

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


    【解决方案1】:

    扩展此 This Answer(归功于 Aaron Bertrand 的函数),您可以通过创建一个拆分函数并将 Cross ApplyGroup By 一起使用来做到这一点:

    CREATE FUNCTION dbo.SplitStrings
    (
        @List       NVARCHAR(MAX),
        @Delimiter  NVARCHAR(255)
    )
    RETURNS TABLE
    AS
        RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
            Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
            CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
        FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
            FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
        WHERE Number <= CONVERT(INT, LEN(@List))
            AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
        ) AS y);
    GO 
    

    样本数据:

    Create Table SplitTest
    (
        A   Varchar (100)
    )
    
    Insert  SplitTest
    Values  ('bar'), 
            ('foo 2015'), 
            ('show me foo'), 
            ('germany foo')
    

    查询:

    Select      f.Item, Count(*) Count
    From        SplitTest                   As s
    Cross Apply dbo.SplitStrings(s.A, ' ')  As F
    Group By    F.Item
    Order By    Count Desc
    

    结果:

    Item    Count
    foo     3
    germany 1
    me      1
    show    1
    2015    1
    bar     1
    

    【讨论】:

      【解决方案2】:

      我认为这是使用sql server的全文搜索功能的一个想法问题。解决这个问题就是全文搜索所做的。

      https://msdn.microsoft.com/en-us/library/ms142571.aspx

      引用该页面:

      全文搜索查询

      在将列添加到全文索引后,用户和 应用程序可以对列中的文本运行全文查询。 这些查询可以搜索以下任何内容:

      • 一个或多个特定单词或短语(简单术语)

      • 以指定文本(前缀词)开头的词或词组

      • 特定词的屈折形式(代词)

      • 与另一个词或词组相近的词或词组(邻近词)

      • 特定单词的同义词(词库)

      • 使用加权值(加权项)的单词或短语

      当产品中已经存在该功能时,为什么要重新发明?

      【讨论】:

        【解决方案3】:

        您应该阅读有关文本挖掘的内容。首先,您应该获取停用词列表http://en.wikipedia.org/wiki/Stop_words 并加载到您的 sql 服务器中,而不是您需要将所有短语拆分为 ngram - 在您的情况下,它将是 1gram,这意味着单个单词,而不是您需要检查如果这些词在停用词列表中,如果不计数。 我很确定你会在网上找到一些教程,但我认为这不是 sql server 的正确工作——我建议使用自定义工具或至少使用自定义 coponent\scripts 的 ssis。它会更容易。正如有人建议的那样,您也可以为全文搜索提供机会,但这取决于您是否可以打开并使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-03
          • 2013-10-24
          • 2012-05-07
          • 2019-07-05
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多