Optimieren der Suche in Datenbanken...

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

Re: Optimieren der Suche in Datenbanken...

am 02.04.2006 23:20:39 von Christian Eberhardt

Ich möchte gern noch ein paar Schlagworte liefern:

Information Retrieval
Crawling
Stemming
Invertierter Index

Re: Optimieren der Suche in Datenbanken...

am 03.04.2006 23:29:37 von Rainer Hinz

Christian Eberhardt wrote:
> Ich möchte gern noch ein paar Schlagworte liefern:
>=20
> Information Retrieval
> Crawling
> Stemming
> Invertierter Index


Danke euch beiden. Nun werde ich mal recherchieren.

Gruß
Anni