2016-06-29 46 views
2

在我尝试创建全文搜索的数据库中,我需要构造一个表,其列名来自上一个表中的一列。在我当前的实施尝试中,全文索引在第一张表Data上完成,并且在那里搜索该短语,然后制作具有搜索结果的第二张表。SQL Server全文搜索与来自上一列的加权列

为数据库中的模式是

**Players** 

    Id 
    PlayerName 
    Blacklisted 
    ... 

**Details** 
    Id 
    Name -> FirstName, LastName, Team, Substitute, ... 
    ... 

**Data** 
    Id 
    DetailId 
    PlayerId 
    Content 

在表Data涉及IdDetailsDetailId,和PlayerId涉及IdPlayers。如果Players中有1k行,Details中有20行,则Data中有20k行。

WITH RankedPlayers AS 
(
    SELECT PlayerID, SUM(KT.[RANK]) AS Rnk 
    FROM Data c 
    INNER JOIN FREETEXTTABLE(dbo.Data, Content, '"Some phrase like team name and player name"') 
    AS KT ON c. DataID = KT.[KEY] 
    GROUP BY c.PlayerID 
) 
… 

然后,通过选择一列中的行来制作表格。类似于一个枢轴。

… 
SELECT rc.Rnk, 
    c.PlayerID, 
    PlayerName, 
    TeamID, 
    … 
    (SELECT Content FROM dbo.Data data WHERE DetailID = 1 AND data.PlayerID = c.PlayerID) AS [TeamName], 
    … 
FROM dbo.Players c 
JOIN RankedPlayers rc ON c. PlayerID = rc. PlayerID 
ORDER BY rc.Rnk DESC 

我可以返回一个排名表,这个实现,其目的不过是为了能够生产从加权列的结果,所以说,列Playername有助于等级超过说TeamName

我已经尝试使用数据透视表制作一个模式绑定视图,但因为透视而无法对其进行索引。我试图对这种观点作出评论,但似乎元数据是继承的,再加上那感觉就像一个笨重的方法。

然后我试图做一个直接查询在select语句中使用子查询,但不能由于索引不喜欢子查询。

然后我试图加入多次,再次在视图上的索引不喜欢自引用连接。

如何做到这一点?

我遇到这篇文章http://developmentnow.com/2006/08/07/weighted-columns-in-sql-server-2005-full-text-search/,和其他文章这里关于加权列,但是没有什么,只要我能找到地址加权列当列最初是行数据。

+0

您是否会回滚解决方案编辑,并将其作为下面的自我回答提供?然后,您可以单击相邻的刻度标记以将问题标记为已解决。谢谢! – halfer

回答

1

一个简单的解决方案,工作得很好。将权重放在另一个表中包含所需ID的行上,将该表添加到已应用全文搜索的表中,并将权重乘以权重。按照之前的实施继续。

在所散发出来的

DECLARE @Weight TABLE 
(
    DetailID INT, 
    [Weight] FLOAT 
); 

INSERT INTO @Weight VALUES 
(1, 0.80), 
(2, 0.80), 
(3, 0.50); 


WITH RankedPlayers AS 
(
    SELECT PlayerID, SUM(KT.[RANK] * ISNULL(cw.[Weight], 0.10)) AS Rnk 
    FROM Data c 
    INNER JOIN FREETEXTTABLE(dbo.Data, Content, 'Karl Kognition C404') AS KT ON c.DataID = KT.[KEY] 
    LEFT JOIN @Weight cw ON c.DetailID = cw.DetailID 

    GROUP BY c.PlayerID 
) 

SELECT rc.Rnk, 
... 

我在这里使用临时表的概念证明代码。我正在考虑将Weights列添加到表Details以避免不必要的表和左连接。