使用sql server全文搜索搜索单个字符后跟连字符后跟更多文本的方法

时间:2011-10-25 00:10:44

标签: sql-server full-text-search

我们的数据可能类似于:

A-10001
A-10002
A-10003
B-10001
B-10002
B-10003

我们想要找到所有包含“A-100”的比赛。使用全文搜索,我们正在做类似的事情:

where contains(e.*, '"A-100*"')

但是,因为“ - ”被认为是一个破坏边界的词,并且因为A是一个干扰词(因为它是一个单个字符),所以查询不会返回任何结果。我想知道是否有任何(简单)方法可以返回预期的结果。

请注意,我理解在这个简化的场景中,我可以使用like而不是contains,类似于:

where 
  (e.myColumn1 like '%A-100%' 
   or e.myColumn2 like '%A-100%' 
   or e.myColumn3 like '%A-100%', 
   etc)

但是对于我的情况不会起作用(主要是出于性能原因而且因为我需要查看很多列)。

我也理解我可以将搜索字符串分成两个单词,并执行以下操作:

where 
  contains(e.*, '"100*"') 
  and (e.myColumn1 like '%A-100%' 
       or e.myColumn2 like '%A-100%' 
       or e.myColumn3 like '%A-100%', 
       etc)

但同样,由于有很多列,这不是一个理想的解决方案。

我对sql server 2005及更高版本的解决方案感兴趣,但是如果有一个特定于sql server 2008的解决方案,我也会对此感兴趣。

感谢您的帮助, 埃里克

1 个答案:

答案 0 :(得分:1)

我认为你不会为此找到一个非常干净的解决方案。我可能会过度简化问题,但我的建议是前两个字符的派生(计算)列。如果您的优先级是读取性能,则将非聚集放在计算列上并包括完整列。这将使得能够寻找'A-'而对于总是需要扫描。即使您要评估多个列,对于每个列,这仍然应该比类似谓词的性能更好。