3

我有动态 sql,它使用 CONTAINSTABLE 执行分页和全文搜索,效果很好。问题是我想使用 FREETEXTTABLE 但将某些列的排名权重于其他列

这是我的原始 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 
4

2 回答 2

0

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

于 2011-12-24T02:58:15.750 回答
0

您可以创建一个具有以下连接的列:

  1. Less_important_field &
  2. More_important_field & More_important_field (2x)

这可能看起来很愚蠢,但它实际上是 BM25F 用来模拟结构化文档的。这种 hack 实现的唯一缺点是您实际上无法动态更改权重。它使表格膨胀了一点,但不一定是索引,它只需要计数。

于 2013-05-10T07:47:39.580 回答