我在SQL Server数据库上使用全文搜索来返回多个表的结果。最简单的情况是搜索人名字段和描述字段。我用它来做到这一点的代码如下所示:全文搜索多个列的分数
select t.ProjectID as ProjectID, sum(t.rnk) as weightRank
from
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL
ON FT_TBL.ProjectID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (FirstName, LastName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
)
group by ProjectID
由于是(希望)清除上面,我想很大程度上体重对一个人的名字超过在项目描述字段匹配匹配。如果我搜索“约翰”这样的东西,那么所有名为约翰的人的项目都会被加权(如预期的那样)。我遇到的问题是有人提供像'约翰史密斯'这样的全名的搜索。在这种情况下,名称上的匹配强度要低得多(我认为)只有一半搜索条件在每个firstname
/lastname
列中匹配。在许多情况下,这意味着与输入名称完全匹配的人不一定会在搜索结果顶部附近返回。
我已经能够通过单独搜索每个firstname
/lastname
领域,增加他们的成绩一起,所以我的新的查询看起来更正此类似:
select t.ProjectID as ProjectID, sum(t.rnk) as weightRank
from
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL
ON FT_TBL.ProjectID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (FirstName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (LastName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
)
group by ProjectID
我的问题:
是这个我应该采取的方法,或者有什么办法让全文搜索在列表上进行操作,就好像它是一个文本块:即将firstname
和lastname
列作为单个name
列处理,从而得到更高的评分匹配str包括人名和姓氏在内?
忘了对此置评。我采取了一种稍微不同的方法来解决这个问题,并将在未来更新我的问题 - 但这对我也很好。谢谢! – Matthew
我在使用单独列时发现的问题之一是,为每列生成的排名不是基于相同的数字。对于相同或类似的搜索,它们可能完全不同。一列可能有700到800之间的等级,另一列有10到20之间的等级,可以运行存储过程来调查生成的排名。 – ScottG
感谢您的反馈 - 我已经忘记了这一点。 – Matthew