【问题标题】:MS SQL FTI - searching on "n*" returns numbersMS SQL FTI - 搜索“n*”返回数字
【发布时间】:2008-09-05 08:43:48
【问题描述】:

这似乎是 SQL 全文索引的奇怪行为。

FTI 将数字存储在其索引中,前缀为“NN”,因此“123”保存为“NN123”。

现在,当用户搜索以 N 开头的单词(即包含 "n*" )时,他们也会得到所有数字。

所以:

select [TextField]
from [MyTable] 
where contains([TextField], '"n*"') 

返回:

MyTable.TextField -------------------------------------------------- 此文本包含单词 navigator 这个文不错 此文本只有 123,不应返回

有没有排除最后一行的好方法?是否有一致的解决方法?


需要那些额外的“”才能使通配符令牌起作用:

select [TextField] from [MyTable] where contains([TextField], 'n*')

将搜索文字 n* - 并且没有。

--return rows with the word text
select [TextField] from [MyTable] where contains([TextField], 'text')

--return rows with the word tex*
select [TextField] from [MyTable] where contains([TextField], 'tex*')

--return rows with words that begin tex...
select [TextField] from [MyTable] where contains([TextField], '"tex*"')

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    有几种方法可以解决这个问题,但都不是那么好。

    首先,在您的表中添加一列,说明TextField 确实是一个数字。如果您可以这样做并进行过滤,您将拥有性能最高的版本。

    如果这不是一个选项,那么您将需要添加更多过滤器。虽然我没有对其进行广泛测试,但您可以添加过滤器AND TextField NOT LIKE 'NN%[0-9]%'

    缺点是这会过滤掉“NN12NOO”,但这可能是您的数据未表示的极端情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2010-11-13
      • 2014-06-28
      • 2014-01-15
      相关资源
      最近更新 更多