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

Posted

技术标签:

【中文标题】SQL Server 全文搜索返回意外结果【英文标题】:SQL Server Full-Text Search returns unexpected result 【发布时间】:2019-08-20 15:31:33 【问题描述】:

我在 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】:

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

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

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

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

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

希望这会有所帮助!

【讨论】:

以上是关于SQL Server 全文搜索返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 全文搜索:干扰词

使用联接的 SQL Server 全文搜索无法按预期工作

将用户输入的搜索查询转换为用于 SQL Server 全文搜索的 where 子句

立即更新全文搜索索引 - SQL SERVER 2012

Sql Server 2005 全文搜索中的噪声词

使用全文搜索来查找部分单词 (SQL Server 2008)