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%'
的搜索太慢了。因此,我使用全文搜索。
在使用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 查询的倒数第二行,我预计中间的结果就会消失。不幸的是,查询没有返回一行。
为什么会这样以及如何解决?
【问题讨论】:
【参考方案1】:问题是在 MS SQL Server 中不支持前导通配符,您只能搜索带有通配符的前缀,例如 "term*"
。根据我的理解,所有前 4 个 JOINs
即使在搜索词中使用前导通配符也会得到解决,因为底层文本包含以 426
、211
、Geschweisst
和 rohr
词开头的词。 .Geschweisste
中的前导点被忽略,因为它是停用词。
但您的文本中没有以bogen
开头 的单词,因为Rohrbogen
中的bogen
位于单词的末尾。由于您使用的是INNER JOIN
,因此您根本没有得到任何结果。
尝试重构您的查询以仅使用带前缀的通配符。
在调查 FTS 引擎如何实际解析您的搜索字词时,此查询可能会有所帮助:
select * from sys.dm_fts_parser('"search terms"', 1033, null, 0)
希望这会有所帮助!
【讨论】:
以上是关于SQL Server 全文搜索返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章