Seite 1 von 1

DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:25
von noisefloor
Hallo,

eine Parameter an einen (My)SQL-Query kann man ja so übergeben:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %s", begriff)
übergeben.

Aber wie funktioniert dass bei Volltextsuche, also wie baut man dafür den folgenden SQL-Query?

Code: Alles auswählen

SELECT * FROM foo WHERE bar LIKE '%begriff%'
Gruß, noisefloor

Re: DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:30
von Hyperion
Ich verstehe die Frage jetzt irgend wie nicht... Du kannst doch in "begriff" in deinem 1. Beispiel alles möglich reinschreiben als String? Order irre ich da?

Re: DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:42
von cofi
Und wenn es doch in den String soll hilft "%%".

Re: DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:47
von noisefloor
Hallo,

ok, was nicht funktioniert ist:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %%s%", begriff)
Und auch alles, was ich sonst so probiert habe (z.B. %%%s%%% oder %%%s%) funzt nicht.

Die "normale" String-Ersetzung funktioniert schon, aber die soll man ja wegen unsicher nicht nehmen, sondern den Weg gem. DB API, s.o.

Gruß, noisefloor

Re: DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:50
von Hyperion
Wieso muss denn das "%" im Query-String stehen?!? Packe das doch in den Parameter rein! Damit bist Du auch viel flexibler... kann ja sein, dass man noch in der Mitte vom Suchbegriff ein "%" haben möchte ;-)

Außerdem solltest Du auf die Anzahl der "%" achten:

Code: Alles auswählen

cursor.execute("SELECT * FROM foo WHERE bar LIKE %%%s%%", begriff)
Du willst vor dem "%s" ein "%"-Zeichen -> 2x "%" tippen. Danach das gleiche... imho sollte das klappen

Re: DB API - Parameter übergeben

Verfasst: Montag 5. Juli 2010, 20:52
von noisefloor
Hallo,

@hyperion: So funktioniert es (habe wohl zu kompliziert gedacht...)

Also wenn man vorher

Code: Alles auswählen

begriff = '%'+begriff+'%'
macht hat man die Volltextsuche.

Interessant wäre trotzdem, ob dass der einzige (und Korrekte) weg ist...

EDIT: %%%s%% funktioniert nicht... IMHO deshalb, weil SQL das 1. und letzte % in Quotes haben will... IMHO kommt hier aber sowas wie %"begriff"% raus -> SQL-Error.

Gruß, noisefloor

Re: DB API - Parameter übergeben

Verfasst: Mittwoch 14. Juli 2010, 11:38
von rads
An sich ist das eine simple Lösung die gut funktionieren sollte.
Leider ist die like - suche relativ langsam, wenn ich das so sagen
darf.

Man könnte überlegen ob man eine Tabelle mit Suchwörtern verwaltet.

Grob angedacht, wird für jedes Suchwort, typischerweise Subjektive,
beim Insert/modify ermittelt und in der Suchtabelle mit Referenz auf
die ID gespeichert. Über die Suchwörter wird ein Index erstellt.

Da meistens nach subjektiven gesucht wird, könnte man hier eine
Leistungssteigerung beim Suchen erreichen, Ändern und Einfügen von
Datensätzen wäre aber natürlich langsamer.

Wobei die Auwahl der Suchbegriffe wohl nicht ganz trivial ist und ist
der Suchaufwand bei Begriffen die nicht in der Suchtabelle sind höher.

Ob der Lösungsansatz überhaupt Sinn macht hängt von der Detaillösung ab,
und so ist das vielleicht schon mit Kanonen auf Spatzen schießen.

Grüße Stefan

p.s. bei mir funktioniert die Lösung von hyperion (mit einer Postgres) auch

Re: DB API - Parameter übergeben

Verfasst: Mittwoch 14. Juli 2010, 15:04
von noisefloor
Hallo,

klar kostet Volltext-Suche viel.

Konkret wird hier primär eine Spalte mit Feldlänge 500, Typ varchar durchsucht.

Ist in meinem Fall über überhaupt kein Performance-Problem, weil die Applikation im Intranet läuft und die DB so wie so weniger als 1 Query/Minute hat...

"In the wild" sollte man aber mit der

Code: Alles auswählen

... LIKE "%suchwort%"
Suche sparsam sein.

Gruß, noisefloor