使用联接的 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 注入的攻击?