2016-06-29 6 views
2

全文検索を作成しようとしているデータベースでは、前の表の1つの列からの列名を持つ表を作成する必要があります。私の現在の実装では、最初のテーブルDataでFullTextのインデックス作成が完了し、そこでフレーズの検索が行われた後、検索結果の2番目のテーブルが作成されます。前の1列の重み付け列を使用したSQL Serverの全文検索

データベースのスキーマが表に

**Players** 

    Id 
    PlayerName 
    Blacklisted 
    ... 

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

**Data** 
    Id 
    DetailId 
    PlayerId 
    Content 

DetailIdあるDataDetailsIdに関し、PlayerIdPlayersIdに関する。 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 
) 
… 

次に、1つの列の行を選択することによって表が作成されます。ピボットに似ています。

… 
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 

が、私はこの実装でランク付けされ、テーブルを返すことができ、その目的は、しかし、加重列からの結果を生成することができるので、列PlayernameTeamNameを言うよりも、より多くのランクに貢献すると言うことです。

ピボットを使用してスキーマにバインドされたビューを作成しようとしましたが、ピボットのためにインデックスを作成できません。私はその見解を見ようとしましたが、メタデータが継承されているように見えますが、それは厄介な方法のように感じます。

次に、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, 
... 

として出てくるコードで

。テーブルDetailsにカラムWeightsを追加して不要なテーブルを避け、結合を残すことを検討しています。

関連する問題