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

Posted

技术标签:

【中文标题】使用联接的 SQL Server 全文搜索无法按预期工作【英文标题】:SQL Server Full Text Search With Join Doesn't work as expected 【发布时间】:2017-12-20 00:21:22 【问题描述】:

使用 CONTAINS 谓词运行全文搜索查询在针对单个表完成时成功运行(简单查询)

SELECT *
FROM [dbo].[Entity] A 
WHERE CONTAINS(A.EntityName,'Test')

此查询返回与 CONTAINS 谓词匹配的多个结果。


SELECT *
FROM [dbo].[Entity] A 
INNER JOIN [dbo].[EntityLink] B
ON A.Id = B.EntityId

此查询还返回多个结果,其中 EntityName 包含短语 Test。


SELECT *
FROM [dbo].[Entity] A 
INNER JOIN [dbo].[EntityLink] B
ON A.Id = B.EntityId
WHERE CONTAINS(A.EntityName,'Test')

此查询不返回任何结果(我刚刚将包含谓词添加到第二个查询中)。 我尝试了多种选择,但我有点沮丧,因为它的表现不如预期。 为什么连接会阻止它正常工作?

【问题讨论】:

您能否添加第二个查询(带有JOIN 但不带CONTAINS)返回的示例数据,特别是那些包含单词Test 的行? 【参考方案1】:

查看带有CONTAINSTABLE的版本是否返回任何数据:

SELECT *
FROM [dbo].[Entity] A 
INNER JOIN [dbo].[EntityLink] B
ON A.Id = B.EntityId
JOIN CONTAINSTABLE([Entity], [EntityName], 'Test') as FTS
ON FTS.[KEY] = A.Id

CONTAINSTABLE 专门用于JOINs。但是,为了 100% 准确,我们需要根据我上面的评论使用JOIN 查看查询返回的数据。

【讨论】:

这实际上运行但仍无法按预期工作。包含 CONTAINSTABLE 的示例: SELECT * FROM CONTAINSTABLE([Entity], [EntityName], 'Test') -> 成功返回所有等于 Test 的 entityNames。但是,如果您将 CONTAINSTABLE 更改为 CONTAINSTABLE([Entity], [EntityName], 'Te') 它不会返回任何结果(尽管有超过 10 个以 Te 开头的实体名称)

以上是关于使用联接的 SQL Server 全文搜索无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?

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

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

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

SQL Server中的全文搜索

SQL Server 2012 安装或添加全文搜索