SQL 使用前一列的加权列进行服务器全文搜索
SQL Server FullText Search with Weighted Columns from Previous One Column
在我尝试创建全文搜索的数据库中,我需要构建一个 table,其列名来自前一个 table 中的一个列。在我当前的实现尝试中,全文索引是在第一个 table Data
上完成的,并且在那里完成了对短语的搜索,然后是第二个 table 和搜索结果。
数据库的模式是
**Players**
Id
PlayerName
Blacklisted
...
**Details**
Id
Name -> FirstName, LastName, Team, Substitute, ...
...
**Data**
Id
DetailId
PlayerId
Content
table中的DetailId
Data
与Details
中的Id
相关,PlayerId
与Id
中的Id
相关Players
。如果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
)
…
然后 table 是通过 select 将一列中的行创建的。类似于枢轴。
…
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
我可以 return 使用此实现排名 table,但目的是能够从加权列中生成结果,所以说列 Playername
有助于排名多说 TeamName
.
我曾尝试使用枢轴制作模式绑定视图,但后来由于枢轴的原因我无法为其编制索引。我已经尝试制作该视图的视图,但元数据似乎是继承的,而且感觉像是一种笨拙的方法。
然后我尝试在 select 语句中使用子查询将其作为直接查询来执行,但由于索引不喜欢子查询而无法实现。
然后我多次尝试连接,视图上的索引又不喜欢自引用连接。
如何做到这一点?
我看过这篇文章 http://developmentnow.com/2006/08/07/weighted-columns-in-sql-server-2005-full-text-search/ 以及此处有关加权列的其他文章,但是据我所知,当列最初是行数据时,我找不到地址加权列。
一个非常有效的简单解决方案。对另一个 table 中包含所需 ID 的行施加权重,将 table 左连接到已应用全文搜索的 table,然后将排名乘以权重。继续之前的实施。
在出现的代码中
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,
...
我在这里使用临时 table 作为概念证据。我正在考虑将列 Weights
添加到 table Details
以避免不必要的 table 和左联接。
在我尝试创建全文搜索的数据库中,我需要构建一个 table,其列名来自前一个 table 中的一个列。在我当前的实现尝试中,全文索引是在第一个 table Data
上完成的,并且在那里完成了对短语的搜索,然后是第二个 table 和搜索结果。
数据库的模式是
**Players**
Id
PlayerName
Blacklisted
...
**Details**
Id
Name -> FirstName, LastName, Team, Substitute, ...
...
**Data**
Id
DetailId
PlayerId
Content
table中的DetailId
Data
与Details
中的Id
相关,PlayerId
与Id
中的Id
相关Players
。如果Players
有1k行,Details
有20行,那么Data
.
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
)
…
然后 table 是通过 select 将一列中的行创建的。类似于枢轴。
…
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
我可以 return 使用此实现排名 table,但目的是能够从加权列中生成结果,所以说列 Playername
有助于排名多说 TeamName
.
我曾尝试使用枢轴制作模式绑定视图,但后来由于枢轴的原因我无法为其编制索引。我已经尝试制作该视图的视图,但元数据似乎是继承的,而且感觉像是一种笨拙的方法。
然后我尝试在 select 语句中使用子查询将其作为直接查询来执行,但由于索引不喜欢子查询而无法实现。
然后我多次尝试连接,视图上的索引又不喜欢自引用连接。
如何做到这一点?
我看过这篇文章 http://developmentnow.com/2006/08/07/weighted-columns-in-sql-server-2005-full-text-search/ 以及此处有关加权列的其他文章,但是据我所知,当列最初是行数据时,我找不到地址加权列。
一个非常有效的简单解决方案。对另一个 table 中包含所需 ID 的行施加权重,将 table 左连接到已应用全文搜索的 table,然后将排名乘以权重。继续之前的实施。
在出现的代码中
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,
...
我在这里使用临时 table 作为概念证据。我正在考虑将列 Weights
添加到 table Details
以避免不必要的 table 和左联接。