3

场景
我已经在 name 列中存储了关于每个产品的一些关键字Tags。当用户搜索该列中存在的单词时,必须显示相关产品。用户可能会在搜索查询中输入一些通用词(例如:an,or,some),因此我目前根据通用性为每个词分配权重。

使用
标签列是全文索引,我Containstable用于搜索关键字。

问题
现在几个月后,表格大小显着增加,我发现使用Containstable. 当用户搜索一个词时(该词在相关行的所有标签列中出现的次数相同),结果行的排名不相等,并且每一行具有较小的关键字计数(从阈值小),得到一个更高的等级。

这不是问题,基于https://technet.microsoft.com/en-us/library/ms142524%28v=sql.105%29.aspxContainsTable使用IndexedRowCountKeyRowCount进行排名。

现在有没有办法仅根据标签列中出现的单词的加权总和对每一行进行排名?

更新
我需要Contains功能加重量之类的东西。
基于https://msdn.microsoft.com/en-us/library/ms187787.aspxweighted_term不影响Contains.

我的新代码没有ContainsTable在下面。这段代码很慢!

declare @q nvarchar(100)='word1#0.5,word2#0.4'
declare @wordsTable table(word nvarchar(30),weight decimal)

insert into @wordsTable
select substring(items,0,CHARINDEX('#',items)) as word,substring(items,CHARINDEX('#',items)+1,LEN(items)) as weight from split(@q,',')

declare @counter int
select @counter=COUNT(*) from @wordsTable
_____________________________________________
select Tags,SUM(rank) as ranks
from(
select (0.5) as rank, Tags from Product where contains(Tags,@word1)
    union 
select (0.4) as rank, Tags from Product where contains(Tags,@word2))
group by Tags
4

0 回答 0