使用联接的 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 全文搜索无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章