Optimieren der Suche in Datenbanken...
am 02.04.2006 11:03:24 von Rainer Hinz
Moin,
ich suche Lösungsansätze, wie man Datenbanken hinsichtlich Suchanfrag=
en=20
optimieren kann.
Ich habe hier gerade ein Projekt, in dem nur drei Tabellen mit ca. 1=20
Millionen Datensätzen durchsucht werden: Jede Spalte mit LIKE %xyz%.
Wie die Indizes gesetzt worden sind, habe ich noch nicht überprüft,=20
aber ich denke soweit korrekt, weil ganz lahm ist die Abfrage ja nicht=20
(optimal auch nicht, alleine schon wegen der "LIKE %%")
Nun kam mir die Idee, sämtliche Suchbegriffe aus der Datenbank zu=20
"extrahieren", z.B. alle Nomen, Namen etc. um diese dann gezielt mit=20
dem Zielobjekt zu verknüppeln:
Beispiel
Begriff FirmID
Medizin 1,2,6,8,190, 2765,124234,213444
Apotheke 6,7,10,789094
Heißt also, ich ordne dem Begriff "Medizin" einer Firma zu. Wenn also=20
nun jemand eine Firma sucht, die mit Medizin zu tun hat, dann würde der=
=20
Begriff mit der entsprechenden ID schneller gefunden werden. So ist=20
meine Idee. Auch von Vorteil wäre, die möglichen Suchergebnisse in=20
einem Auswahlfenster mittels XAjax anzuzeigen.
Dieses Prinzip ist doch mit Sicherheit schon bekannt, oder?
Irgendwelche Hinweise, Keywords(!), Links?
Danke und Gruß
Anni
Re: Optimieren der Suche in Datenbanken...
am 02.04.2006 11:55:20 von Axel Schwenke
Anni Schmidt wrote:
> ich suche Lösungsansätze, wie man Datenbanken hinsichtlich Suchanfragen
> optimieren kann. ... mit LIKE %xyz%.
> Wie die Indizes gesetzt worden sind, habe ich noch nicht überprüft,
Das kannst du dir in diesem Fall sparen. LIKE '%$foo%' kann keine
Indizes benutzen. Wenn du mit den Einschränkungen leben kannst, ist
evtl. die Volltextsuche von MySQL etwas für dich.
Aber wahrscheinlich willst du dir eher eine "richtige" Volltext-
Suchmaschine anschauen. Swish++, Lucene oder Mnogosearch fallen mir
da spontan ein.
> Nun kam mir die Idee, sämtliche Suchbegriffe aus der Datenbank zu
> "extrahieren", z.B. alle Nomen, Namen etc. um diese dann gezielt mit
> dem Zielobjekt zu verknüppeln:
> Beispiel
> Begriff FirmID
> Medizin 1,2,6,8,190, 2765,124234,213444
> Apotheke 6,7,10,789094
Herzlichen Glückwunsch! Du hast gerade die Funktionsweise einer Voll-
textsuchmaschine "erfunden". Dazu extrahiert man Suchbegriffe aus dem
Text und baut einen Suchindex Suchbegriff -> Dokument auf.
Üblicherweise benutzt man eine weitere Indirektion:
table document {
doc_id INT,
doc_content TEXT
}
table searchterm {
term_id INT,
term_string VARCHAR()
}
table term_doc {
term_id INT,
weight float,
doc_id INT
}
Über das Gewicht (weight) kann man regulieren, wie 'passend' ein
Suchbegriff für ein Dokument ist. Z.B. bekommt der Suchbegriff ein
höheres Gewicht, wenn er häufig oder an prominenter Stelle (im Titel)
des Dokuments vorkommt.
Für erste Schritte in diese Richtung dürfte Mnogosearch gut geeignet
sein. Die setzen dieses Prinzip (mit Abwandlungen) um und verwenden
z.B. MySQL für die Suchtabellen.
XL