【问题标题】:Search for words in SQL Server index在 SQL Server 索引中搜索单词
【发布时间】:2010-09-14 11:47:53
【问题描述】:

我需要介于全文搜索和索引搜索之间的东西:
我想在我的表格的一列中搜索文本(如果这很重要,那么列上可能也会有一个索引)。

问题是,我想在列中搜索单词,但我不想匹配部分。

例如,我的专栏可能包含公司名称:
Mighty Muck Miller and Partners Inc.
男孩和黄油早餐公司

现在,如果我搜索“Miller”,我想找到第一行。但是如果我搜索“iller”,我不想找到它,因为没有以“iller”开头的单词。不过,搜索“Break”应该会找到“Boy & Butter Breakfast company”,因为有一个词以“Break”开头。 p>

所以如果我尝试使用

WHERE BusinessName LIKE %Break%

它会找到太多的命中。

有没有办法搜索由空格或其他分隔符分隔的单词?

(LINQ 最好,纯 SQL 也可以)

重要提示:到目前为止,空格并不是唯一的分隔符!应考虑使用斜线、冒号、点和所有非字母数字字符!

【问题讨论】:

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


    【解决方案1】:
    where BusinessName like 'Break%' -- to find if it is beginning with the word
    or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
    

    【讨论】:

    • 所以我必须为每个可能的分隔符添加一个“或喜欢”,比如斜杠、冒号、点......? 男孩和黄油早餐公司
    • 不,如果您有更多分隔符(您稍后指定),那么这不是一个好的解决方案。如果您正在使用 SQL 2005 或 SQL 2008,或者正在考虑全文搜索,也许您可​​以尝试正则表达式。
    • 其实它从一开始就在文本中(或其他分隔符),但是由于每个人都错过了这三个词,我选择突出显示它们并另外添加一些关于此的解释 - 抱歉,已经隐藏得很提前做好。
    • 您可能想为自己创建一个“搜索列”,即与企业名称相同,但您将所有标点符号等替换为标准分隔符,例如“|”。您可以为此使用视图。然后只需搜索“|Break%”。
    • 对不起,我也错过了那部分。我的错。
    【解决方案2】:
    WHERE BusinessName LIKE '% Break%'
    

    【讨论】:

      【解决方案3】:

      你提到了 LINQ - 你可以做类似...

      string myPattern = "% Break%";
      
      var query =
            from b in Business
            where SqlMethods.Like(b.BusinessName, myPattern) 
            select b;
      

      请注意,这使用了 System.Linq.Data.SqlClient 命名空间,它直接转换为 LIKE 运算符,无需额外处理。

      【讨论】:

        【解决方案4】:

        您的单词分隔符会很多:空格、制表符、行首、括号、句点、逗号、感叹号/问号等。因此,一个非常简单的解决方案是在 WHERE 子句中使用正则表达式。 (而且它会比对你能想到的所有可能的分隔符进行 ORing 更有效率。)

        既然你提到了 LINQ,这里有一篇文章描述了如何做efficient regex querying with SQL Server

        就性能而言,像这样复杂的 WHERE 子句总是会引起我的注意,因此我绝对建议您对最终得到的任何结果进行基准测试,毕竟您可能决定为该列构建搜索索引。

        编辑:看到您编辑了您的问题。当writing your regex 时,很容易让它使用任何非字母字符作为分隔符,即 [^0-9a-zA-Z],或 \W 表示任何非单词字符,\b 表示任何单词边界和\B 用于任何非单词边界。或者,不匹配分隔符,只匹配任何单词,即 \w+。这是another example 有人使用 SQL Server 进行正则表达式搜索(比您需要的更复杂)。

        【讨论】:

          【解决方案5】:

          SQL Server 2000 或更高版本。

          SELECT *
            FROM dbo.TblBusinessNames
           WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence
              OR BusinessName like 'Break%'            -- At the beginning of a sentence
          

          LIKE 的关键字参考:http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

          【讨论】:

          • 哇,太棒了,就是这样 - 我必须添加一些外来字符 (äöüÄÖÜß),但这比创建时髦的正则表达式效果要好得多!
          【解决方案6】:

          试试这个:

          declare @vSearch nvarchar(100)
          
          set @vSearch = 'About'
          
          select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-29
            • 1970-01-01
            • 1970-01-01
            • 2017-03-20
            • 2020-05-31
            • 1970-01-01
            相关资源
            最近更新 更多