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",但这可能是数据无法代表的极端情况。