在SQL Server索引中搜索单词

Sam*_*Sam 6 sql linq sql-server full-text-search

我需要在全文搜索和索引搜索之间进行一些操作:
我想在我的表的一列中搜索文本(如果这很重要,也可能在列上有一个索引).

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

例如,我的专栏可能包含公司名称:
Mighty Muck Miller and Partners Inc.
Boy&Butter Breakfast公司

现在,如果我搜索" 米勒 ",我想找到第一行.但是,如果我搜索" iller ",我不想找到它,因为没有任何词以"iller"开头.搜索" 休息 "应该找到" 男孩和黄油早餐公司 ",但是,因为一个词以" 休息 " 开头.

所以,如果我尝试使用

WHERE BusinessName LIKE %Break%
Run Code Online (Sandbox Code Playgroud)

它会找到太多的点击量.

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

(LINQ将是最好的,纯SQL也会这样做)

重要提示:空间远不是唯一的分隔符!斜线,冒号,圆点,所有非字母数字字符都应该考虑到这一点!

joe*_*rdi 6

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

既然你提到了LINQ,这里有一篇文章描述了如何用SQL Server进行高效的正则表达式查询.

就性能而言,像这样复杂的WHERE子句总是会引发一个红旗,因此我绝对建议您根据最终结果进行基准测试,您可能决定为该列构建搜索索引.

编辑:看到你编辑了你的问题.在编写正则表达式时,很容易让它使用任何非孤立字符作为分隔符,即[^ 0-9a-zA-Z],或者对于任何非单词字符使用\ W,对于任何单词边界使用\ b\B表示任何非字边界.或者,不是匹配分隔符,只匹配任何单词,即\ w +.这是使用SQL Server进行正则表达式搜索的另一个例子(比你需要的更复杂).


Ric*_*o C 3

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
Run Code Online (Sandbox Code Playgroud)

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