Andreas-Lindig: Wie erstellt man index-Dateien für eine Volltext-Suche?

Beitrag lesen

Hallo Hallo Hallo,

Nehmen wir an, du hast ein Index der wie folgt aussieht:

Datenbank;192;168
Index;485;129
Andreas;904;129
Halihallo;985;374
Hallihallo;859;86
haaalooo;983;124

das ist eine mögliche Darstellung eines assoziatives Array in einer Textdatei. Wenn nun
eine Suchanfrage zum Wort "Andreas" ansteht, solltest du _niemals_ die ganze Datei in ein
assoziatives Array der Programmiersprache einlesen.

Ich dachte das Array soll nicht so eindimensional (eigentlich ja zweidimensional) vorliegen, wie oben, sondern z.B. so:

$suchfeld['a'] = array(); (du kennst PHP?)
$suchfeld['d'] = array();
$suchfeld['h'] = array();
$suchfeld['i'] = array();

$suchfeld['a']['Andreas'] = array(904,129);
$suchfeld['d']['Datenbank'] = array(192,168);
$suchfeld['h']['Halihallo'] = array(985,374);
$suchfeld['h']['Hallihallo'] = array(859,86);
$suchfeld['h']['haaalooo'] = array(983,124);

das entspräche ja im Grunde schon der Aufteilung der Indexdateien nach Buchstaben, wie weiter unten angesprochen oder?

mal angenommen, dieses Array würde nicht zu groß (z.B. weil es eigentlich nur für einen Anfangsbuchstaben gilt - wie unten beschrieben, also die erste Dimension gelte dann schon dem zweiten Buchstaben: $suchfeld['aa'], $suchfeld['ab'], $suchfeld['ac'] usw.), würde das Programm denn für obiges Beispiel bei der Suche nach 'Hallihallo' direkt in $suchfeld['h'] springen?

[...]

Ich fasse zusammen (so für mich): wenn die Datei zu groß ist, kann ich sie nicht mehr einlesen wg. Speichermangel. Wenn ich sie aber Zeile für Zeile durchsuchen will, sollte sie vorsortiert sein, aber gleichzeitig geteilt, weil ich nicht an beliebiger Stelle die Suche starten kann.

a) Du nimmst dennoch eine Datenbank.

also zum Beispiel, eine Tabelle mit den feldern a-z und da pack ich die Suchwörter rein? - Ich will einfach mal vermeiden, die ganzen Postings in die DB zu quetschen (ansonsten wäre der Volltextindex wohl echt das Bessere - und eben: lernen, popernen ;).

c) Du erstellst mehrere Dateien (z.B. für jeden Anfangsbuchstaben eine)

ja, so ist es auch in der JS-Suche von SelfHtml gemacht, der hat sogar für einen Buchstaben mehrere Dateien - hab' ich noch nicht ganz verstanden. Aber der liest die Dateien auch in ein Array ein - wohl nur die, die er braucht. Jedenfalls ist die Suche sauschnell.

d) Du erstellst einen Algorithmus, der in Textdateien diejenige Zeile ausgibt, in
   welcher die ersten Zeichen dem Suchwort entsprechen.

nix verstehen! muß diese Datei dann auch erst Zeile für Zeile durchsucht werden? oder ist das eine Abkürzung?

e) [weitere]

auch 'ne gute Möglichkeit ;)

Wenn eine _sortierte_ Liste vorliegt, kannst du - wenn du den Aufwand schon betreibst -
es gleich noch viel besser umsetzen: Stichwort: Binäre Suchbäume (B-Tree).

eieiei, was ist das denn? Michael Schröpl hat hier neulich auch von 'allfälligen Indexbäumen' gesprochen - war aber etwas abstrakt.

Gruß, Andreas

--
http://extra.andeas-lindig.de/was_das/