我在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查询的第二行包括在内,我希望中间的结果会消失。不幸的是,查询返回的不是一行。
为什么以及如何解决?
答案 0 :(得分:0)
问题在于,在MS SQL Server中不支持前导通配符,您只能搜索带有通配符的前缀,例如"term*"
。根据我的理解,即使搜索词中的前四个通配符都被解析,所有前4个JOINs
也会得到解析,因为基础文本包含以您的426
,211
,Geschweisst
和rohr
个字词。 .Geschweisste
中的前导点被忽略,因为它是一个停用词。
但是您的文本中没有单词以bogen
开头,因为bogen
中的Rohrbogen
位于单词的末尾。由于您使用的是INNER JOIN
,所以根本没有结果。
尝试将查询重构为仅使用带前缀的通配符。
在调查FTS引擎实际如何解析搜索字词时,此查询也可能会有所帮助:
select * from sys.dm_fts_parser('"search terms"', 1033, null, 0)
希望这会有所帮助!