首页 > 解决方案 > SQL Server 全文搜索返回意外结果

问题描述

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

CONTAINS经过大量尝试和FREETEXT...后,我的查询如下所示

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 查询的倒数第二行,我希望中间的结果会消失。不幸的是,查询没有返回一行。

为什么会这样以及如何解决?

标签: sqlsql-serverfull-text-searchcontainscontainstable

解决方案


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

但是您的文本中没有以开头的单词,bogen因为bogeninRohrbogen位于单词的末尾。由于您正在使用,因此INNER JOIN您根本没有得到任何结果。

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

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

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

希望这可以帮助!


推荐阅读