方案
我已在名称为Tags
的列中存储了有关每种产品的一些关键字。当用户搜索此列中存在的字词时,必须显示相关产品。用户可以在搜索查询中输入一些常规单词(例如:an,或者some),因此我当前基于一般性为每个单词分配权重。
是
标签列是全文索引的,我使用Containstable
搜索关键字。
问题
几个月后,表格大小显着增加,我发现使用Containstable
时出现问题。当用户搜索单词时(相关行的所有Tags列中该单词的出现次数相同),结果行的Rank不相等,并且每个具有较小关键字count(从阈值开始小)的行正在获得更高等级。
这不是问题,基于https://technet.microsoft.com/en-us/library/ms142524%28v=sql.105%29.aspx,ContainsTable
使用IndexedRowCount
和KeyRowCount
进行排名。
现在有没有办法根据标签栏中出现的单词的加权和来对每一行进行排名?
更新
我需要Contains
功能加上重量的东西
基于https://msdn.microsoft.com/en-us/library/ms187787.aspx,weighted_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