【问题标题】:SQL Server FullText Search with Weighted Columns from Previous One ColumnSQL Server 全文搜索与前一列的加权列
【发布时间】:2016-06-29 22:30:46
【问题描述】:

在我尝试创建全文搜索的数据库中,我需要构建一个表,其列名来自前一个表中的一列。在我当前的实现尝试中,全文索引在第一个表 Data 上完成,并在那里完成了对短语的搜索,然后制作了带有搜索结果的第二个表。

数据库的架构是

**Players**

  Id
  PlayerName
  Blacklisted
  ...

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

**Data**
  Id
  DetailId
  PlayerId
  Content

表中的DetailId DataDetails 中的Id 相关,PlayerIdPlayers 中的Id 相关。如果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/ 和其他关于加权列的文章,但是当列最初是行数据时,我找不到地址加权列。

【问题讨论】:

  • 您会回滚解决方案编辑,并在下面将其作为自我回答提供吗?然后,您可以单击相邻的勾号将问题标记为已解决。谢谢!

标签: sql-server full-text-search


【解决方案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,
...

我在这里使用一个临时表来证明概念。我正在考虑在表Details 中添加一列Weights,以避免不必要的表和左连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2010-10-04
    • 1970-01-01
    • 2016-07-14
    • 2011-02-09
    相关资源
    最近更新 更多