2016-06-29 7 views
2

In der Datenbank, in der ich versuche, eine FullText-Suche zu erstellen, muss ich eine Tabelle mit den Spaltennamen aus einer Spalte in einer vorherigen Tabelle erstellen. In meinem aktuellen Implementierungsversuch ist die FullText-Indizierung auf der ersten Tabelle Data abgeschlossen und die Suche nach dem Ausdruck erfolgt dort, dann wird die zweite Tabelle mit den Suchergebnissen erstellt.SQL Server FullText Suche mit gewichteten Spalten von einer vorherigen Spalte

Das Schema für die Datenbank ist

**Players** 

    Id 
    PlayerName 
    Blacklisted 
    ... 

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

**Data** 
    Id 
    DetailId 
    PlayerId 
    Content 

DetailId in der Tabelle Data-Id in Details bezieht und PlayerId betrifft Id in Players. Wenn es 1k Zeilen in Players und 20 Zeilen in Details gibt, dann gibt es 20k Zeilen in 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 
) 
… 

Dann wird eine Tabelle erstellt, indem die Zeilen in einer Spalte ausgewählt werden. Ähnlich einem Drehpunkt.

… 
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 

ich eine Rang Tabelle mit dieser Implementierung zurückbringen kann, aber das Ziel ist es, Ergebnisse aus gewichteten Spalten zu erzeugen, so sagt die Spalte Playername in den Rang trägt mehr als TeamName sagen.

Ich habe versucht, eine Schema gebundene Ansicht mit einem Pivot zu machen, aber dann kann ich es wegen des Pivots nicht indizieren. Ich habe versucht, einen Blick auf diese Ansicht zu werfen, aber es scheint, dass die Metadaten vererbt werden, und das fühlt sich an wie eine klobige Methode.

Ich habe dann versucht, es als eine direkte Abfrage mit Unterabfragen in der Select-Anweisung, aber kann nicht aufgrund der Indizierung nicht wie Unterabfragen.

Ich habe dann versucht, mehrere Male zu verbinden, wieder der Index auf der Ansicht nicht wie selbstreferenzierende Joins.

Wie geht das?

Ich bin auf diesen Artikel http://developmentnow.com/2006/08/07/weighted-columns-in-sql-server-2005-full-text-search/ und andere Artikel hier über gewichtete Spalten gestoßen, jedoch nichts, soweit ich Adressen mit Gewichtungsspalten finden kann, wenn die Spalten anfänglich Zeilendaten waren.

+0

Würdest du die Lösung zurücksetzen und sie unten als Selbstantwort eingeben? Sie können dann auf das nebenstehende Häkchen klicken, um die Frage als gelöst zu markieren. Vielen Dank! – halfer

Antwort

1

Eine einfache Lösung, die wirklich gut funktioniert. Geben Sie die Zeilen mit den erforderlichen IDs in eine andere Tabelle ein, verknüpfen Sie die Tabelle mit der Tabelle, auf die die Volltextsuche angewendet wurde, und multiplizieren Sie den Rang mit dem Gewicht. Weiter wie zuvor implementiert.

In Code, die

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, 
... 

wie kommt Ich bin eine temporäre Tabelle hier zum Nachweis von Konzept. Ich erwäge, eine Spalte Weights der Tabelle Details hinzuzufügen, um eine unnötige Tabelle und linken Join zu vermeiden.