sql的全文搜索对于多列查询时怎么设置每列的权重
sql的全文搜索对于多列查询时如何设置每列的权重?
我对一张表的多个列进行了全文索引(title,abstract等列),在使用关键字查询
结果排序并不如预期好。排序一般是所有列匹配关键字最多的排在前面。
实际上我想要的结果是title列的权值最高,如果关键字和title匹配就排最靠前,其次才列出来与content和abstract匹配的结果。
如何才能实现给每个列分配权值,进行最终的排序?
------解决方案--------------------
------解决方案--------------------
CONTAINSTABLE函数可以返回对关键词匹配的排名,但是如楼主要求的最出现字段的权值不同而影响排序则较难实现,可以试下一下写法是否可行(没有环境测试是否可以)
我对一张表的多个列进行了全文索引(title,abstract等列),在使用关键字查询
select * from [dbo].[table] where CONTAINS(*,'关键字')
结果排序并不如预期好。排序一般是所有列匹配关键字最多的排在前面。
实际上我想要的结果是title列的权值最高,如果关键字和title匹配就排最靠前,其次才列出来与content和abstract匹配的结果。
如何才能实现给每个列分配权值,进行最终的排序?
------解决方案--------------------
-- 假设[table]表的主键字段是(ID int),
-- 建临时表
create table #t(ID int, -- 主键字段
qz int -- 权值
)
-- 依字段分别计算匹配的权值
insert into #t(ID,qz)
select ID,1000 -- title匹配时,权值1000
from [dbo].[table]
where contains(title,'关键字')
insert into #t(ID,qz)
select ID,100 -- content匹配时,权值100
from [dbo].[table]
where contains(content,'关键字')
insert into #t(ID,qz)
select ID,10 -- abstract匹配时,权值10
from [dbo].[table]
where contains(abstract,'关键字')
-- 汇总ID的权值之和,依权值之和降序排列.
select *
from [dbo].[table] a
inner join (select ID,sum(qz) 'qz'
from #t
group by ID) b on a.ID=b.ID
order by b.qz desc
------解决方案--------------------
CONTAINSTABLE函数可以返回对关键词匹配的排名,但是如楼主要求的最出现字段的权值不同而影响排序则较难实现,可以试下一下写法是否可行(没有环境测试是否可以)
select * from [dbo].[table] where CONTAINS(*,'关键字')
order by case when contains(title,'关键字') then 1 else 2 end