MS SQL FTI-搜索" n *"将返回数字
时间:2020-03-05 18:48:06 来源:igfitidea点击:
从SQL的全文索引来看,这似乎是奇怪的行为。
FTI在其索引中以" NN"为前缀存储数字,因此将" 123"另存为" NN123"。
现在,当用户搜索以N开头的单词(即包含" n *")时,他们还将获得所有数字。
所以:
select [TextField] from [MyTable] where contains([TextField], '"n*"')
返回值:
MyTable.TextField -------------------------------------------------- This text contains the word navigator This text is nice This text only has 123, and shouldn't be returned
有什么好方法可以排除最后一行吗?是否有一致的解决方法?
要使通配符起作用,需要那些额外的"":
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*"')
解决方案
回答
有两种方法可以解决此问题,尽管两者都不是那么好。
首先,在表格中添加一栏,说明" TextField"实际上是一个数字。如果可以执行此操作并进行过滤,那么我们将获得性能最高的版本。
如果这不是一个选择,那么我们将需要添加其他过滤器。虽然我还没有对其进行广泛的测试,但是我们可以添加过滤器AND TextField NOT LIKE'NN%[0-9]%'
不利的一面是,这会过滤掉" NN12NOO",但这可能是数据无法代表的极端情况。