ich habe da so ein kleines Verständnisproblem bei der Volltextsuche.
Es geht um diese Prozedur:
CREATE PROCEDURE dbo.Volltextsuche
@Suche nvarchar(200)
AS
BEGIN
SELECT Felder
FROM Tabelle
WHERE (CONTAINS(Suchfeld, @Suche))
END
Der Parameter "@Suche" wird im Client über ein Editierfeld gefüllt.
Wenn der User hier ein Wort eingibt, z.B. "Test", erscheinen
erwartungsgemäß alle Datensätze, bei denen das Suchfeld das Wort
"Test" enthält.
Wenn der User mehrere Wörter eingibt - durch Leerzeichen getrennt -
hätte ich eigentlich gerne alle Datensätze, die eines dieser Wörter
enthalten. Es erscheint aber ein Syntaxfehler. Was mache ich falsch?
Gruß,
Matthias
Hallo Matthias,
schau Dir mal die ersten beiden Beispiele aus der Online-Doku an. Bei
mehreren Wörtern, sind diese in doppelte Hochkommata gepackt.
-- Einfaches Wort
where contains(Suchfeld, 'Gebrüder')
-- Mehrere Worte
where contains(Suchfeld, '"Gebrüder Meyerbier"')
-- Alternative Worte
where contains(Suchfeld, '"Gebrüder" OR "Meyerbier"')
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org
vielen Dank für die Antwort, aber genau das funktioniert irgendwie
nicht so ganz wie gewünscht.
Wenn ich "Gebrüder Meyerbier" eingebe, würde ich gerne alle
Datensätze finden, bei denen das Suchfeld beide Wörter enthält,
"Gebrüder" und "Meyerbier" (in meinem ursprünglichen Posting hatte ich
das nicht ganz korrekt beschrieben).
Wenn ich doppelte Hochkommata verwende, bekomme ich offenbar nur die
Datensätze, in denen diese Wörter direkt hintereinander stehen. Drehe
ich das ganze um,
where contains(Suchfeld, '"Meyerbier Gebrüder"')
erhalte ich nicht wie erwartet das gleiche Ergebnis wie vorher,
sondern keinen einzigen Datensatz.
So funktioniert es:
where contains(Suchfeld, 'Meyerbier AND Gebrüder')
also muss ich wohl im erwähnten Editierfeld im Client den vom User
eingegebenen Text parsen und Leerzeichen durch " AND " ersetzen?
Ich verwende übrigens SQL 2005.
Gruß,
Matthias
Hallo Matthias,
so ist es, falls die Wörter nicht unbedingt nebeneinander stehen müssen!
Hier noch ein paar Beispiele, wie man suchen kann:
-- Benachbarte Wörter (wobei NEAR ca. 8 bis 10 Wörter weit sucht. Genaues
ist nicht bekannt!)
where contains(Suchfeld, 'Häute NEAR Felle')
-- Wortanfang suchen
where contains(Suchfeld, '"Int*" AND "Pal*"')
-- Suche nach einem String, der am Ende stehen muss
-- Läuft vier mal schneller, als nur mit like
where contains(Suchfeld, 'bank')
and Suchfeld like '%bank'
> -- Suche nach einem String, der am Ende stehen muss
> -- Läuft vier mal schneller, als nur mit like
> where contains(Suchfeld, 'bank')
> and Suchfeld like '%bank'
Wie soll das funktionieren? Wenn im Suchfeld z.B. "Sitzbank" vorkommt wird
CONTAINS(Suchfeld, 'bank') nicht fündig.
Da es mit der "LIKE" Abfrage "AND" verknüpft ist, wird dabei auch nichts
rauskommen...
Können Sie mir erklären, wie Sie das meinten?
Habe nämlich das Problem, dass die "LIKE" Abfragen zu langsam sind und die
CONTAINS() mir nicht alle gewollten Ergebnisse liefern.
Vielen Dank im Voraus.
Grüße,
Jens
Hallo Jens,
hier duzt man sich normalerweise.
Falls es kein eigenständiges Wort ist, dann müßte man noch ein *
vorwegsetzen.
where contains(Suchfeld, '*bank')
and Suchfeld like '%bank'
Einen schönen Tag noch,
dein Lösungsvorschlag funktioniert bei mir leider nicht. Ich erhalte kein
Ergebnis.
> Falls es kein eigenständiges Wort ist, dann müßte man noch ein *
> vorwegsetzen.
>
> where contains(Suchfeld, '*bank')
> and Suchfeld like '%bank'
Ist es nicht so, dass CONTAINS nur nach Wortanfängen suchen kann?
Gruß,
Jens
Hallo Jens,
vergiß meine Antwort von gestern. War etwas im Streß und das mit dem Stern
ist quatsch.
Bei mir funktioniert die Suche mit contains(Suchfeld, 'bank') auch für das
Vorkommen von bank in einem anderen Wort, was wahrscheinlich auf Grund der
Worterkennung/Zerlegung funktioniert. Handelsbank wäre so ein Beispiel, was
ich finden kann.
Beschreib doch mal bitte etwas genauer, was Du für Daten hast, wonach Du
suchst, welches Ergebnis Du erwartest und was Du erhältst.
in meiner Tabelle habe ich diverse Zubehörteile, z.B. "Telegabel",
"Federgabel", "Gabelbein", "Schaltgabelführung"
Bei diesen Wörtern z.B. würde eine Suche mit CONTAINS(Bezeichnung, 'gabel')
nur "Gabelbein" zurückgeben.
Würde in diesem Fall aber gern alle 4 Begriffe finden.
Momentan behelfe ich mir so, dass, wenn die Abfrage mit "CONTAINS" kein
Ergebnis liefert, ich eine weitere Abfrage mit "LIKE" ausführe.
...
Verdammte Axt, jetzt hab ich es mal wirklich mit den Beispielwörtern
probiert und es funktioniert. Eine Suche nach "gabel" ergibt alle 4
Ergebnisse. Hat der SQL Server eine Art Wörterbuch, wo "Gabel" als Wort
hinterlegt ist und danach indiziert wird?
Komisch. Allerdings hätte ich es gerne soweit, das eine Suche nach "belbe"
dann "Gabelbein" als Ergebnis ausspucken würde, was bei der CONTAINS()
Abfrage nicht zurückkommt. Scheinbar komme ich an meiner Kombi-Lösung nicht
drumrum. Oder gibt es vielleicht eine möglichkeit beim Erzeugen des
Volltextindexes sämtliche Buchstabenreihenfolgen zu indizieren? Das würde
dann allerdings einen extrem großen Index geben...
Grüße,
Jens
Hallo Jens,
die Volltextindizierung ist nicht einfach ein Index über Buchstaben, sondern
mit viel Logik behaftet, die ausserdem noch sprachspezifisch ist:
http://msdn.microsoft.com/de-de/library/ms142571.aspx
Volltextsuche (SQL Server)
Volltextabfragen führen linguistische Suchvorgänge in den Textdaten von
Volltextindizes aus, indem sie nach den Regeln einer bestimmten Sprache, wie
z. B. Englisch oder Japanisch, Wörter und Ausdrücke verarbeiten.
Volltextabfragen können einfache Wörter und Ausdrücke oder mehrere Formen
eines Worts bzw. Ausdrucks enthalten.
http://msdn.microsoft.com/de-de/library/ms142547.aspx
Übersicht über die Volltextsuche
alles klar, danke für die Antwort. Werd mich wohl ein bischen intensiver
damit befassen müssen...
Gruß,
Jens