2010-03-04 6 views
5

Im Prinzip habe ich eine Tabelle wie folgt aus:Wie Abfrage SQL Server 2008-Datenbank für Vor- und Nachname und Reihenfolge nach Relevanz?

CREATE TABLE Person(
    PersonID int IDENTITY(1,1) NOT NULL, 
    FirstName nvarchar(512) NOT NULL, 
    LastName nvarchar(512) NULL 
) 

Und ich brauche auf einem Benutzer-Abfrage wie folgt die oben n Ergebnisse basieren zu finden:

"Joh Smi" 

Die folgende Abfrage gibt die Ergebnisse Ich brauche (denke ich). Nur nicht in der entsprechenden Reihenfolge.

SELECT 
    PersonID, FirstName, LastName 
FROM 
    Person 
WHERE 
    FirstName LIKE 'Joh%' OR 
    LastName LIKE 'Joh%' OR 
    FirstName LIKE 'Smi%' OR 
    LastName LIKE 'Smi%' 

Wenn die folgenden Namen waren in der Datenbank und unsere Top-Abfrage war "Joh Smi" die Namen in der folgenden Reihenfolge (oder ähnlich)

  1. John Smith
  2. Johnny Smith erscheinen soll
  3. John Jacob
  4. David Smithsonian
  5. Daniel Johnson

Ich hoffe, es zu funktionieren ähnlich wie Facebook Autocomplete Friend-Search.

Also, wie gebe ich die obersten n relevantesten Zeilen in SQL Server 2008 zurück?

Antwort

2

Als Nachtrag zu OMG Ponies Antwort ...

um die besten Ergebnisse aus einer Volltextsuche erhalten Sie vielleicht cr Verwenden Sie eine indizierte Sicht, die die Felder für den ersten und letzten Namen verkettet.

Damit können Sie einzelne Teile des vollständigen Namens genauer gewichten.

Beispielcode wie folgt:

CREATE VIEW [dbo].[vFullname] WITH SCHEMABINDING AS 
    SELECT personID, FirstName + ' ' + LastName AS name 
    FROM dbo.person 

    WITH ranks AS(
    SELECT FT_TBL.personid 
     ,FT_TBL.name 
     ,KEY_TBL.RANK 
    FROM dbo.vfullname AS FT_TBL 
     INNER JOIN CONTAINSTABLE(vfullname, (name), 
    'ISABOUT ("Smith" WEIGHT (0.4), "Smi*" WEIGHT (0.2), 
"John" WEIGHT (0.3), "Joh*" WEIGHT (0.1))') AS KEY_TBL 
      ON FT_TBL.personid = KEY_TBL.[KEY] 
    ) 
    SELECT 
    r.personID, 
    p.firstname, 
    p.lastname, 
    r.rank 
    FROM ranks r INNER JOIN 
    person p ON r.personID = p.personID 
    ORDER BY rank DESC; 

Der CTE erlaubt Ihnen nur die einzelnen Felder Vorname und Nachname zurückzukehren. Wenn Sie diese nicht als Ausgabe benötigen, ignorieren Sie sie.

1

Sie müssen zuerst entscheiden, was Sie mit Relevanz meinen. Hier ist meine Liste von Relevanz

  1. Beiden Worte sind genau Vor- und Nachname
  2. Gleiche wie die erste, aber in umgekehrter Reihenfolge
  3. Einen komplettes Wort ist, ist man String
  4. Gleiche wie 3.
  5. Beide sind Teilstrings. Innerhalb dieser können Sie durch die Länge der Teilkette (mehr Mittel gut)
  6. One ist String

So bewerten würde ich Ihnen empfehlen Funktion zu erstellen, die Vor- und den Nachnamen und Eingabestring und Return int nehmen, oder schweben accoring zu Regeln, dann sortiere nach.

+0

Liebe die Liste. Wie aber würde die SQL-Abfrage/-Funktion aussehen? :-) –

+0

hey, es ist fast 2 Uhr hier, ich will schlafen :) – Andrey

+0

haha. ok ok ... ich gebe dir eine Pause. –

5

Ich empfehle Umsetzung Volltextsuche (FTS) aus zwei Gründen:

  1. die Abfrage vereinfachen (sollte die RUP nicht brauchen, which'll schlechte Leistung)
  2. die FTS Nutzen Funktionalität Ranking - siehe this article
Verwandte Themen