2013-04-16 51 views
0

我在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 

我的问题:

是这个我应该采取的方法,或者有什么办法让全文搜索在列表上进行操作,就好像它是一个文本块:即将firstnamelastname列作为单个name列处理,从而得到更高的评分匹配str包括人名和姓氏在内?

回答

1

我最近遇到了这个问题,并使用计算列将所需的列连接在一起成为一个字符串,然后在该列上具有全文索引。

我已经通过复制计算列中的加权字段来实现加权。

即,姓氏出现3次并且名字出现一次。

​​

你必须确保你使用持久关键字,这样计算各列的心不是阅读。

+0

忘了对此置评。我采取了一种稍微不同的方法来解决这个问题,并将在未来更新我的问题 - 但这对我也很好。谢谢! – Matthew

+0

我在使用单独列时发现的问题之一是,为每列生成的排名不是基于相同的数字。对于相同或类似的搜索,它们可能完全不同。一列可能有700到800之间的等级,另一列有10到20之间的等级,可以运行存储过程来调查生成的排名。 – ScottG

+0

感谢您的反馈 - 我已经忘记了这一点。 – Matthew