Frage

Ich arbeite derzeit an einer Anwendung, in der wir über eine SQL-Server-Datenbank verfügen, und ich muss eine Volltextsuche zum Laufen bringen, mit der wir nach Namen von Personen suchen können.

Derzeit kann der Benutzer einen in ein Namensfeld eingeben, das drei verschiedene Varchar-Spalten durchsucht.Vorname, Nachname, zweiter Vorname

Angenommen, ich habe 3 Zeilen mit den folgenden Informationen.

1 – Phillip – J – Fry

2 – Amy – NULL – Wong

3 – Löwe – NULL – Wong

Wenn der Benutzer einen Namen wie „Fry“ eingibt, wird Zeile 1 zurückgegeben.Wenn sie jedoch Phillip Fry, Fr oder Phil eingeben, erhalten sie nichts.und ich verstehe nicht, warum es das tut.Wenn sie nach Wong suchen, erhalten sie die Zeilen 2 und 3, wenn sie nach Amy Wong suchen, erhalten sie erneut nichts.

Derzeit verwendet die Abfrage CONTAINSTABLE, aber ich habe dies durch FREETEXTTABLE, CONTAINS und FREETEXT ersetzt, ohne dass es erkennbare Unterschiede in den Ergebnissen gab.Die Tabellenmethoden werden bevorzugt, da sie dieselben Ergebnisse liefern, jedoch mit einer Rangfolge.

Hier ist die Abfrage.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Irgendwelche Ideen...?Warum funktioniert diese Volltextsuche nicht korrekt?

War es hilfreich?

Lösung 3

Vielen Dank für die Antworten, Leute, ich konnte es endlich zum Laufen bringen.Mit einem Teil der Antworten von Biri und Kibbee.Ich musste der Zeichenfolge * hinzufügen und sie in Leerzeichen aufteilen, um zu funktionieren.Also am Ende habe ich es bekommen

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Es werden weitere Felder durchsucht. Ich habe die Frage nur vereinfacht. Tut mir leid, ich dachte nicht, dass es Auswirkungen auf die Antwort haben würde.Tatsächlich wird eine Spalte durchsucht, die eine CSV-Datei mit Spitznamen und auch eine Notizenspalte enthält.

Danke für die Hilfe.

Andere Tipps

FreeTextTable sollte funktionieren.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString sollte Werte wie „Phillip Fry“ enthalten (eine lange Zeichenfolge, die alle durch Leerzeichen getrennten Suchzeichenfolgen enthält).

Wenn Sie nach Fr oder Phil suchen möchten, sollten Sie ein Sternchen verwenden:Phil* und Fr*

„Phil“ sucht genau nach dem Wort „Phil“.„Phil*“ sucht nach jedem Wort, das mit „Phil“ beginnt.

Wenn Sie nur nach Namen von Personen suchen, ist es möglicherweise in Ihrem Interesse, nicht einmal den Volltextindex zu verwenden.Ein Volltextindex ist sinnvoll, wenn Sie über große Textfelder verfügen. Wenn Sie jedoch hauptsächlich mit einem Wort pro Feld arbeiten, bin ich mir nicht sicher, wie viel mehr Sie aus Volltextindizes herausholen würden.Eines der vielen Probleme kann sein, darauf zu warten, dass sich der Volltextindex neu indiziert, bevor Sie nach neuen Datensätzen suchen können.

Sie könnten einfach eine Abfrage wie die folgende stellen.Teilen Sie Ihren Suchbegriff in Leerzeichen auf und erstellen Sie eine Liste der Suchbegriffe.

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

Ein anderer Ansatz könnte darin bestehen, die Suche von den einzelnen Feldern abzustrahieren.

Mit anderen Worten: Erstellen Sie eine Ansicht Ihrer Daten, die alle geteilten Felder wie Vorname Nachname in verkettete Felder umwandelt, d. h.vollständiger Name

Suchen Sie dann nach der Ansicht.Dies würde die Suchanfrage wahrscheinlich einfacher machen.

Vielleicht möchten Sie einen Blick darauf werfen Lucene.net als Alternative zum Volltext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top