如何在多个表SQL Server 2005中使用全文搜索

Gre*_*g B 5 full-text-search sql-server-2005 multiple-tables

我有一个包含两个表的全文目录.

tableA在目录中索引了4列(a1,a2,a3,a4),a2,a3,a4.a1是主键.

tableB有3列(b1,b2,b3,b4),其中两列在目录中被索引,b3和b4.b1是该表的PK,b2是表A的FK.

我想做点什么

SELECT *, (ftTableA.[RANK] + ftTableB.[RANK]) AS total_rank 
FROM tableA
INNER JOIN tableB ON tableA.a1=tableB.b2
INNER JOIN FREETEXTTABLE(tableA, (a2,a3,a4), 'search term') as ftTableA ON tableA.a1=ftTableA.[KEY]
INNER JOIN FREETEXTTABLE(tableB, (b3,b4), 'search term') as ftTableB ON tableB.11=ftTableB.[KEY]
Run Code Online (Sandbox Code Playgroud)

但这不起作用......我可以让单个表工作,例如.

SELECT *, (ftTableA.[RANK] + ftTableB.[RANK]) AS total_rank 
FROM tableA
INNER JOIN FREETEXTTABLE(tableA, (a2,a3,a4), 'search term') as ftTableA ON tableA.a1=ftTableA.[KEY]
Run Code Online (Sandbox Code Playgroud)

但从不超过一张桌子.

有人可以给出对多个表进行全文搜索所需步骤的解释和/或示例.

小智 2

我不确定我理解你想要做什么。我将您的问题解释为您想要返回表 A 中与搜索词匹配的所有项目。此外,您想要对 TableA 中的项目加上 TableB 中的匹配项目的排名求和。

我能想到的最好方法是使用带有 3 个查询的表变量。

DECLARE @Results Table (a1 Int UNIQUE, Rank Int)

--将TableA中的所有匹配项插入到@Results中
插入@Results
(a1,排名)
( SELECT TableA.a1, FT.Rank
FROM TableA INNER JOIN FreeTextTable(TableA, *, '搜索词') FT
ON 表A.A1 = FT.[关键]
)

--用当前值加上总和来更新@Results中的所有排名
--所有子项(在TableB中)
更新@结果
SET Rank = RS.Rank + FT.Rank
FROM @Results RS INNER JOIN 表B
ON RS.A1 = 表B.b2
INNER JOIN FreeTextTable(TableB, *, '搜索词') FT
ON 表B.b1 = FT.[关键]

--现在将在 TableB 中匹配但在 TableA 中不匹配的任何项目插入到 @Results 中
-- 根据您的业务规则,可能需要/可能不需要此查询。
插入@Results
(技能键 ID、等级)
( SELECT TableB.b2, Sum(FT.Rank)
FROM TableB INNER JOIN FreeTextTable(TableB, *, '搜索词') FT
ON 表B.b1 = FT.[key]
左连接@结果RS
ON RS.a1 = 表B.b2
其中 RS.a1 为 NULL
分组依据表B.b2
)

--剩下的就是返回结果了
SELECT TableA.*, RS.Rank AS Total_Rank
FROM TableA INNER JOIN @Results RS
ON 表A.a1 = RS.a1
按 RS.Rank DESC 排序

这不像使用一个查询那么优雅,但它应该很容易理解,并允许您决定是否在第三个查询中包含记录。