在SQL Server索引中搜索单词

时间:2008-10-01 10:10:39

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

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

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

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

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

所以,如果我尝试使用

WHERE BusinessName LIKE %Break%

会发现太多点击。

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

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

重要提示:空间不是唯一的分隔符!为了实现这一点,应考虑使用斜杠,冒号,圆点,所有非字母数字字符!

6 个答案:

答案 0 :(得分:6)

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

由于您提到了LINQ,这里有一篇介绍如何efficient regex querying with SQL Server

的文章

就性能而言,像这样复杂的WHERE子句总是会引发一个红旗,所以我绝对建议你最终得到什么样的基准测试,你可能决定为这个列建立一个搜索索引。

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

答案 1 :(得分:4)

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

答案 2 :(得分: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

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

答案 3 :(得分:1)

WHERE BusinessName LIKE '% Break%'

答案 4 :(得分:1)

你提到过LINQ - 你可以做点像......

string myPattern = "% Break%";

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

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

答案 5 :(得分:0)

试试这个:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'