SQL Server全文搜索返回意外结果

时间:2019-03-29 16:25:55

标签: sql sql-server full-text-search contains containstable

我在Microsoft SQL Server数据库表中有几百万条记录。用[Column] LIKE '%test%'进行的搜索太慢了。因此,我使用全文搜索。

经过CONTAINSFREETEXT的多次尝试后,我的查询如下所示。

SELECT [SearchText] FROM [Service].[CatalogArticleCache] AS t
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*426*"') AS s1 ON t.ArticleId = s1.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*211*"') AS s2 ON t.ArticleId = s2.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*Geschweisst*"') AS s3 ON t.ArticleId = s3.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*rohr*"') AS s4 ON t.ArticleId = s4.[KEY]
--INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*bogen*"') AS s5 ON t.ArticleId = s5.[KEY]
ORDER BY [SearchText]

该查询返回一些记录,例如...

426 211357 .Geschweisste Rohrbogen 2d90
426 211682 .Geschweisste Leitungsrohre ungegl.
426 211990 .Geschweisste Rohrbogen D + 100
...

一旦我将SQL查询的第二行包括在内,我希望中间的结果会消失。不幸的是,查询返回的不是一行。

为什么以及如何解决?

1 个答案:

答案 0 :(得分:0)

问题在于,在MS SQL Server中不支持前导通配符,您只能搜索带有通配符的前缀,例如"term*"。根据我的理解,即使搜索词中的前四个通配符都被解析,所有前4个JOINs也会得到解析,因为基础文本包含以您的426211Geschweisstrohr个字词。 .Geschweisste中的前导点被忽略,因为它是一个停用词。

但是您的文本中没有单词以bogen开头,因为bogen中的Rohrbogen位于单词的末尾。由于您使用的是INNER JOIN,所以根本没有结果。

尝试将查询重构为仅使用带前缀的通配符。

在调查FTS引擎实际如何解析搜索字词时,此查询也可能会有所帮助:

select * from sys.dm_fts_parser('"search terms"', 1033, null, 0)

希望这会有所帮助!