Unter Windows nennt sich grep (mehr oder weniger) find und findstr, ich denke aber, das ist nicht wirklich praktikabel für den Sachbearbeiter von der Stange
Ich habe es erstmal so gemacht:
Ich habe testweise diverse 10-tausende Dateien in einer Datei zusammengeführt (die störten mich irgendwie), das ergab so 100 MB. Die laufende Nummer jedes Datensatzes in der Datei wird in einer Map mit seiner Anfangsposition in der Datei (loc(datei)) gepeichert.
Dann werden die einzelnen Worte extrahiert (ca. 2 Mio) und mit der Nr. des Datensatzes, in dem sie vorkommen, in einer Liste gespeichert. Alles in Kleinschreibung, alles Nicht-Alphanumerisches wird mit RegExpr entfernt, Umlaute und ß werden substituiert. Aus der Liste werden doppelte Wörter und einige gramatikalische Varianten entfernt, ihre Datensatznummern dem Datensatznummerrstring des verbleibenden Wortes mit einem Trennzeichen hinzugefügt. Ergibt also etwa ein Element:
haus
20350/15887/9003/2872/539/34/....
wobei dann da auch die Datensatznummern von Hauses, Häuser, Häusern und so drinstehen.
Das Ganze wird einmal nach Wörtern sortiert, und dann wird auch noch der Datensatzstring jedes Wortes sortiert (Das rückwärts, damit später die neuesten Datensätze zuerst gefunden werden).
Eine Liste und keine Map ist das, weil später nicht nur genaue Übereinstimmungen gefunden werden sollen, sondern auch Worte, die das Suchwort nur enthalten. Eine Map geht ja nur mit exakten Schlüsselworten.
Diese Indexliste enthält dann alle verschiedenen Wörter (gut 80.000) mit den Datensatznummern, in denen sie vorkommen.
Dauert alles in Allem knappe 40 Sekunden.
Für die Suche erstelle ich dann daraus erstmal eine Liste, in der die Adresse jedex x-ten (ich habe erstmal so jedes 200ste genommen) Elements zusammen mit seinem Wort gespeichert ist.
Bei der Suche wird zunächst diese letzte Liste durchlaufen, bis der dortige Worteintrag größer ist als das Suchwort (das natürlich auch RegExpr-mäßig pp. bearbeitet wird). Ein Element zurück ergibt eine Position vor dem dem ersten gesuchten Wort der Indexliste mit der entsprechenden Adresse in der Indexdatei. Dieses Element der Indexliste wird dann über die Adresse direkt angesprungen. Das erspart es, die Indexliste jedesmal ganz von vorne zu durchlaufen. Im Durchschnitt müßten dann bis zum ersten Worttreffer (Indexelemente/200 + Indexelement(200/2)) durchlaufen werden (bei 80000 Einträgen also 6000) anstatt Indexelemente/2 (das wären 40.000), oder wie ist das? Allerdings scheint diese Einsprungmethode testmäßig nicht spürbar schneller zu sein als das Durchlaufen der Indexliste immer von Anfang an, merkwürdig.
Dann wird die Indexliste durchlaufen und für jedes Suchwort das gefundene Wort zusammen mit dem String mit den Dateinummern in einer weiteren Liste gespeichert (Der erste Treffer natürlich auch). In der Liste stehen dann die Datensatznummern der Datensätze, in denen der gesuchte Begriff vorkommt.
Bei mehreren Suchwörter wird das für jedes Suchwort gemacht.
Dann wird noch ne' Liste mit den Nummern der Datensätze generiert, in der alle Suchworte vorkommen

. Es werden also die Datennummernstrings auf Gemeinsamkeiten getestet, das entfällt natürlich, wenn es nur ein Suchwort gibt.
Und nun wird in der allerersten Liste, dem Dateisatzindex nachgekuckt, in welcher Dateiposition (loc()) die jeweiligen Datensätze der großen Datendatei stehen, die werden angesprungen und die Datensätze werden angezeigt.
Ich weiß ja nicht, ob das alles wirklich so praktisch ist, aber die Suchzeit beträgt (für maximal 30 gefundene Datensätze, mehr kuckt man sich eh' nicht an) maximal 30 Millisekunden (Intel 3 GHZ), je nachdem wieviele Suchwörter verwendet werden (praktisch sind es ja allenfalls 3) und wieviele Listenelemente durchlaufen werden müssen. Meistens sind es 15 Millixsec, manchmal werden "0" behauptet, ebenso, wenn kein Datensatz gefunden wird. Ich denke mal, das ist nicht so schlecht dafür, daß aus einer 100 MB-Datei eben nicht nur genaue Wortübereinstimmungen gefunden werden. Sonst ginge es rein über Maps sicher noch schneller.
Die gesamten Originaldaten, um die es geht, sind alledings noch ein bißchen größer. Und wenn das alles (Bis auf die Suchworteingabe) auf dem Server läuft, kann es natürlich auch noch anders aussehen, aber im Prinzip dürfte es funktionieren.
Firefox killen klappt aber immer noch nicht, ich habe noch ein paar andere Methoden ausprobiert, aber die müssen da irgend etwas eingebaut haben ...
Erstmal danke für die Hilfe.