Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Volltextsuche über Prozedur-Parameter

25 views
Skip to first unread message

Matthias Schuppe

unread,
Jan 7, 2009, 4:41:34 AM1/7/09
to
Hallo zusammen,

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

Christoph Muthmann

unread,
Jan 7, 2009, 5:11:54 AM1/7/09
to

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


Matthias Schuppe

unread,
Jan 7, 2009, 5:50:21 AM1/7/09
to
Hallo Christoph,

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

Christoph Muthmann

unread,
Jan 7, 2009, 7:00:04 AM1/7/09
to
Matthias Schuppe wrote:
> Hallo Christoph,
> [snip]

> 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?

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'

Jens Urban

unread,
Apr 2, 2009, 8:24:19 AM4/2/09
to
Hallo Christoph,

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


Christoph Muthmann

unread,
Apr 2, 2009, 9:52:46 AM4/2/09
to


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,

Jens Urban

unread,
Apr 3, 2009, 2:31:49 AM4/3/09
to
Hallo Christoph,

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


Christoph Muthmann

unread,
Apr 3, 2009, 2:48:33 AM4/3/09
to


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.

Jens Urban

unread,
Apr 3, 2009, 3:49:38 AM4/3/09
to

Hallo Christoph,

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

Christoph Muthmann

unread,
Apr 3, 2009, 4:51:13 AM4/3/09
to

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

Jens Urban

unread,
Apr 3, 2009, 7:44:28 AM4/3/09
to
Hallo Christoph,

alles klar, danke für die Antwort. Werd mich wohl ein bischen intensiver
damit befassen müssen...


Gruß,

Jens

0 new messages