ich bin auf der Suche nach dem SELECT Befehl…
Ich habe mir bisher mit
select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR
(b like ‚%suchbegriff%‘)
Das kann es doch nicht sein, oder?
Doch, das kann sein!
Oder alles in „Einem“:
select a, b, c, FROM tabelle WHERE a||b||c|| …
like ‚%suchbegriff%‘
select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR
(b like ‚%suchbegriff%‘)
Das kann es doch nicht sein, oder?
Was ist daran auszusetzen?
Na daß die höllische Gefahr besteht, bei Erweiterung der Tabelle eine Spalte zu vergessen, die dann nicht mit abgefragt wird. (meine Tabelle ist ein bißchen größer als abc. Eigentlich war ich auf der Suche nach einer spaltenunabhängigen Abfrage…
Na daß die höllische Gefahr besteht, bei Erweiterung der
Tabelle eine Spalte zu vergessen, die dann nicht mit abgefragt
wird. (meine Tabelle ist ein bißchen größer als abc.
Eigentlich war ich auf der Suche nach einer
spaltenunabhängigen Abfrage…
Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle) mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure oder aus C/C++ Programm.
Na daß die höllische Gefahr besteht, bei Erweiterung der
Tabelle eine Spalte zu vergessen
Hmmm… das stimmt wohl, aber aus Gründen des Arbeitsstils würde ich nicht meine grundsätzliche Anwendungslogik über den Haufen werden… Das was Du beschreibst heißt gemeinhin „bug“ und gehört eigentlich wegprogrammiert.
Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle)
mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String
zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure
oder aus C/C++ Programm.
Ja, das ist alles sicherlich machbar. Ich frage mich nur: was soll das? Entweder ich weiß, was ich suche, oder ich tue es nicht. Ich kann mir keine sinnvolle Anwendung vorstellen, bei der ich einen Begriff „irgendwo“ gesucht werden würde; als Anwendungsentwickler bin ich in Besitz meines Datenmodells.
Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle)
mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String
zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure
oder aus C/C++ Programm.
Ja, das ist alles sicherlich machbar. Ich frage mich nur: was
soll das? Entweder ich weiß, was ich suche, oder ich tue es
nicht. Ich kann mir keine sinnvolle Anwendung vorstellen, bei
der ich einen Begriff „irgendwo“ gesucht werden würde; als
Anwendungsentwickler bin ich in Besitz meines Datenmodells.
Ok, ich kann mir eine Anwendung vorstellen, wo ich irgendwo irgendwas suche - z.B. wenn ich ein DB untersuchen soll, ist aber selten zusehen, sonst habe ich nur die Frage beantwortet, das was…
Ob das sinnvoll ist oder nicht soll Maik entscheiden.
Ihr habt Euch schrecklich viel Gedanken gemacht, danke schön, eigentlich wollte ich nur vermeiden, den Änderungswünschen anderer Leute hinterherzuprogrammieren, solche ‚bugs‘ habe ich schon öfter gebracht.
Und das wollte ich halt vermeiden, wenn ich meine Suchabfrage schreibe.
Außerdem dachte ich, daß andere Leute, die richtig große Datenbanken durch ‚SUCHEN‘ bestimmt schnellere Algorithmen zur Hand nehmen…
Ob das sinnvoll ist oder nicht soll Maik entscheiden.
Für mich bestimmt nicht, das ist eine Nummer zu groß, da ich die Datenbank per PHP befrage, muß ich den Query ja nicht immer mit der Hand schreiben.
Mit einer derartigen Suche vergibst du dir aber alle Möglichkeiten, über Indizes zu suchen, was schon bei moderaten Datenmengen ins Abseits führt.
Eine echte Volltextsuche ist aber etwas anderes. Entweder die Datenbank bietet sie „schon eingebaut“, wie z.B. MS SQL Server - oder man muss sie sich selber basteln…
Darüber hinaus ist es normalerweise besser, den Benutzer zu „gezieltem“ Suchen anzuleiten. (Also ‚xxx%‘ und nicht ‚%xxx%‘ und dann natürlich Indizes zu verwenden!)
Mit einer derartigen Suche vergibst du dir aber alle
Möglichkeiten, über Indizes zu suchen, was schon bei moderaten
Datenmengen ins Abseits führt.
Das habe ich befürchtet…
Eine echte Volltextsuche ist aber etwas anderes. Entweder die
Datenbank bietet sie „schon eingebaut“, wie z.B. MS SQL Server
oder man muss sie sich selber basteln…
ach mySQL auch? Und wenn nicht, wie bastelt man dann? Vielleicht hätte ich fragen sollen: Wie baue ich eine Volltextsuche…
Darüber hinaus ist es normalerweise besser, den Benutzer zu
„gezieltem“ Suchen anzuleiten. (Also ‚xxx%‘ und nicht ‚%xxx%‘
und dann natürlich Indizes zu verwenden!)
Vielleicht hätte ich fragen sollen: Wie baue ich eine
Volltextsuche…
Die übliche Vorgehensweise ist, das man
eine Wort-Zerlegungs-Heuristik entwickelt
eine Tabelle mit zu ignorierenden Wörtern aufbaut
durch die relevanten Felder (i.d.R. Text- und Memo-Felder oder nur bestimmte Felder) der zu indizierende(n) Tabelle(n) geht und dann jedes mit 1. gefundene Wort, was nicht in 2. steht
in einer Tabelle mit dem Verweis auf die Fundstelle ablegt
„Fundstelle“ kann jetzt alles mögliche sein - je nach gewünschter Granularität und Universalität, also z.B.
Tabellenname, Feldname, Position im Feld usw.
Wegen des Datenvolumens wird man wohl nicht mit den echten Namen, sondern mit Schlüsseltabellen arbeiten, so auch z.B.
die eigentlichen Suchwörter getrennt von den Fundstellen ablegen.
Kallo Maik,
Kevin Clevenger hat ein kleines Skript für eine „Suchmaschine“ in php geschrieben.
Vielleicht hilft sie Dir ein wenig weiter! http://px.sklar.com/code.html?code_id=144
Gruß Wolfgang
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]