Langsame Textsuche

04/09/2007 - 12:07 von Heinz Zastrau | Report spam
Hallo Leute,

ich habe zwei Textdateien mit fester Lànge und folgender Struktur:

Artikeldaten
06 Char Artikelnummer
30 Char Title
08 Char Preis (in Cent ohne Kommastellen)
04 Char Rabatt (mal 100, ohne Kommastellen)
01 Char MwSt (1 = 7%, 2 = 19%, 3 = keine)
02 Char Lieferstatus
06 Char Lieferantennummer

Artikeleigenschaften
06 Char Artikelnummer
03 Char Eigenschaftsart (zb. A00 Enthaltenes Lied oder B00 Komponist)
65 Char Eigenschaftswert

Die Datei Artikeldaten enthàlt ca. 350.000 Zeilen und die
Artikeleigenschaften ca. 3.000.000 Zeilen.

Zu beantworten sind nun Fragen wie:
Ermittel alle Artikel die weniger als "10€" kosten und ein Lied ("A00")
das das Wort "SONNE" und eins (evt. anderes), das das Wort "SOMMER"
beinhaltet.

Der erste Ansatz Bestand darin die Daten in Paradox-Tabellen zu laden
(nicht weil Paradox so schön ist sondern einfach weil das umgebene
Projekt damit Arbeitet (ohne nennenswerte Probleme, wie man mir
versicherte :-) )).

Auf die beiden Tabellen ließ ich dann folgendes SQL-Statement los:

select distinct
a.Artikelnummer
from
Artikeldaten a
inner join Artikeleigenschaften ae1 on ae1.Artikelnummer =
a.Artikelnummer
inner join Artikeleigenschaften ae2 on ae2.Artikelnummer =
a.Artikelnummer
where
PriceInCent >= 0
and ae1.Code = 'A00' and ae1.Text like '%SONNE%'
and ae2.Code = 'A00' and ae1.Text like '%SOMMER%'


Die Zeiten liegen allerdings im Minutenbereich (ich bin auch nicht
wirklich überrascht) und sind daher inakzeptable.

Gesucht wird nun also eine Lösung die bei dem gezeigten SQL-Statement
eine akzeptable Performance verspricht, gleichzeitig aber überschaubar
beim Installationsaufwand und den Systemanforderungen ist. Ich brauche
keine Transaktionen, keinen Multiuser-Zugriff und nach dem die Daten im
passenden Format geschrieben sind wird nur noch lesend darauf
zugegriffen. Eine DB erscheint mir fast schon zuviel des guten zu Mal
"like"-Abfragen sich auch nicht einfach mit Indizes unterstützen lassen.
Wichtig wàre mir halt eine einfache Abfragesprache wie SQL.

Kennt einer von euch ein (DB-)System, oder Bibliothek das mir bei meinem
Problem helfen würde? Kosten darf es natürlich auch was. :-) Sonst würde
ich als nàchstes die embedded Version von Firebird ausprobieren und mal
sehen wie lange die braucht.

Vielen Dank im Voraus.

Ciao Heinz Z.
 

Lesen sie die antworten

#1 Joachim Duerr
04/09/2007 - 15:01 | Warnen spam
Heinz Zastrau schrieb in <fbjap1$14g$:

Gesucht wird nun also eine Lösung die bei dem gezeigten SQL-Statement
eine akzeptable Performance verspricht, gleichzeitig aber überschaubar
beim Installationsaufwand und den Systemanforderungen ist. Ich
brauche keine Transaktionen, keinen Multiuser-Zugriff und nach dem
die Daten im passenden Format geschrieben sind wird nur noch lesend
darauf zugegriffen. Eine DB erscheint mir fast schon zuviel des guten
zu Mal "like"-Abfragen sich auch nicht einfach mit Indizes
unterstützen lassen. Wichtig wàre mir halt eine einfache
Abfragesprache wie SQL.

Kennt einer von euch ein (DB-)System, oder Bibliothek das mir bei
meinem Problem helfen würde? Kosten darf es natürlich auch was. :-)



Du könntest Dir in diesem Zusammenhang mal den Advantage Database
server (besser: den kostenlosen Advantage Local Server - ALS)
anschauen. Integriert ist eine Volltextsuche (FTS), welche Du auf die
entsprechenden Felder anlegen kannst und das gewünschte liefert:

SELECT ... WHERE CONTAINS(*,'SONNE AND SOMMER')
^^ alle FTS indizierten Felder
SELECT ... WHERE CONTAINS(Code,'SONNE AND SOMMER')
^^^^ nur in diesem Feld

Ich habe mal als Demo ein paar Newsgroups importiert (~700MB Daten).
200.000 Postings filtert der ALS mit einem FTS Index in knapp 20 msec.
Joachim Dürr
Sybase iAnywhere
AdvantageSupport[at]ianywhere.com

Ähnliche fragen