在动态SQL中使用FREETEXTTABLE对列的优先级/权重

时间:2009-12-03 13:33:42

标签: tsql full-text-search ranking

我有动态sql,使用CONTAINSTABLE执行分页和全文搜索,工作正常。问题是我想使用FREETEXTTABLE但是比其他人更重要一些colums的等​​级

这是我的原始sql和我想要整合的排名权重 (出于隐私原因,我更改了名称)

SELECT * FROM 
    (SELECT TOP 10 Things.ID, ROW_NUMBER() 
        OVER(ORDER BY KEY_TBL.RANK DESC ) AS Row FROM [Things]
    INNER JOIN 
        CONTAINSTABLE([Things],(Features,Description,Address),
            'ISABOUT("cow" weight (.9), "cow" weight(.1))') AS KEY_TBL 
    ON [Properties].ID = KEY_TBL.[KEY] 
    WHERE TypeID IN (91, 48, 49, 50, 51, 52, 53) 
        AND
        dbo.FN_CalcDistanceBetweenLocations(51.89249, -8.493376, 
        Latitude, Longitude) <= 2.5 
    ORDER BY KEY_TBL.RANK DESC ) x 
WHERE x.Row BETWEEN 1 AND 10

这是我想要整合的内容

select sum(rnk) as weightRankfrom
From
(select 
    Rank * 2.0 as rnk, 
    [key] 
from freetexttable(Things,Address,'cow')
union all 
select 
    Rank * 1.0 as rnk, 
    [key] 
from freetexttable(Things,(Description,Features),'cow')) as t 
group by [key] 
order by weightRankfrom desc 

2 个答案:

答案 0 :(得分:0)

不幸的是,freetext引擎(FREETEXTTABLE)使用的算法无法指定各种输入列的重要性。如果这很关键,您可能需要考虑使用不同的产品来满足您的自由文本需求。

答案 1 :(得分:0)

您可以使用以下连接创建列:

  1. Less_important_field&amp;
  2. More_important_field&amp; More_important_field(2x)
  3. 这可能看起来很愚蠢,但它实际上是BM25F模拟结构化文档的行为。这种黑客实施的唯一缺点是你实际上无法动态改变权重。它稍微膨胀了一下,但不一定是指数,这应该只需要计数。