Hallo!
strip_tags() ist eine recht böse Funktion. Die löscht nämlich alles, was zwischen einem < und einem > steht, vollkommen unabhängig davon, ob es nun wirklich ein Tag ist oder nicht. Da zum Glück anzunehmen ist, dass < und > hier entweder maskiert sind oder zum HTML gehören, kommst du noch einmal davon (schlecht ist diese Funktion bei Usereingaben, die möglicherweise HTML enthalten könnten - da wird unter Umständen zuviel gelöscht).
Ja, da hatten wir schonmal drüber diskutiert, aber soweit ich weiß ist es im Selfforum nicht möglich eigene <> in den HTML-Quellcode zu bekommen, doer? Also sollte es gehen, oder? Irgendwie muß ich den Code ja rausbekommen! Daher filtere ich erst die Basisdaten aus dem Thread(Thema, User, zeit), dann entferne ich die html-tags, und dannach wandele ich html-entitäten um.
So komme ich auf ca. 12 MB pro Monat, was in etwa mit dem Archiv übereinstimmt. Habe jetzt mal die letzten 4 Monate in der Datenbank(50MB Daten, 40 MB Index ;-))
Ich habe jetzt 3 Stunden lang versucht MySQL 4 zu installiern, was an sich nicht schwer war, aber ich habe es nicht fetiggebraucht aus PHP darauf zuzugreifen, vielleicht braucht man ein anders Modul? k.a., aber das probiere ich irgendwann sicher nochmal, denn gerade für Volltext-Suche ist die 4er erheblich besser.
Keine Ahnung, was da schief läuft. Offen gesagt habe ich auch gerade nicht die Lust zum Selbersuchen. Ich geh' lieber gleich mal durch die neue Elbtunnelröhre. ;)
Lag daran, das durch die Komprimierung bei langen Dateien irgendwie Zeilenumbrüche reingekommen sind, die ich nicht erwartet habe, und so habe ich immer nur den Teil bis zum ersten Zeilenumbruch gehabt... ich denk jetzt ist mein "Archiv-parser" funktionsfähig.
Was ich gemerkt habe, der Index muß immer aktuell sein, wenn ich ein paar 1000 Datensätze in die Tabelle schreibe, wird die Suche erheblich langsamer. Ich habe jetzt ca. 12.000 Datensätze in der DB(1 pro Thread), und da dauert es mehr als 15 Minuten den Index neu zu erstellen! Auch wenn ich eine kompletten Dump im batch-modus einlese!
Und die ganze Zeit ist die CPU und der Arbeitsspeicher bis zum Anschlag ausgelastet! Ich denke daher das mehr CPU-Power und vor allem RAM sehr wohl was bringt! Kann man nie genug haben, zumindest solange das System drauf ausgereichtet ist. Wie pflegt Ihr denn solche Indices?
Die Datenbank lasse ich jetzt auch mal online, würde mich mal interssieren was Ihr davon haltet.
Die Tabelle hat folgende Struktur:
CREATE TABLE selfarchiv (
id smallint(6) NOT NULL default '0',
topic varchar(20) NOT NULL default '',
title varchar(100) NOT NULL default '',
body text NOT NULL,
name varchar(40) NOT NULL default '',
time int(10) NOT NULL default '0',
PRIMARY KEY (id),
UNIQUE KEY id (id),
FULLTEXT KEY body (body,topic,title)
) TYPE=MyISAM;
Wobei ich glaube ich auf unique und Primärschlüsel verzichten kann, denn das bringt hier eh nichts. Die Gewichtung ist aber nicht das gelbe vom Ei. Das ist noch viel zu unflexibel. Außerdem ist das Verhätnis nicht ganz richtig. Ich hatte mir folgendes überlegt, um dem Titel und dem Themenbereich mehr Gewicht zu verleihen:
entweder ich füge eine weiter Spalte ein, und hier dann duch Leerzeichen getrennt 5 mal das Thema und 10 mal den Titel, und das dann mit in den Index aufnehmen, oder 15 weiter Spalten mit entsprechend 5 mal Titel und 10 mal Themenbereich.
Ich habe auch schon ein eine eigene stop-word Liste gedacht, indem ich beim Anlegen der Datensäzte dort ausgewiesene Wörter entferne.
Wobei ich gestehen muß, Ihr hattet Recht, so viel schneller ist die DB auch nicht, aber auf der anderen Seite habe ich keine Ahnung wie man das ganze wirklich performant macht, da gibt es ja glaube ich noch einige Möglichkeiten...
Das Parse-Script ist übrigens ziemlich simpel, ich habe das so gelöst:
$handle=opendir($path);
while ($dir = readdir ($handle)) {
if ($dir!= "." && $dir != "..") {
$id = $dir;
$html = gzfile($path.$dir."/".$filename);
if(isset($html[1])) {
$data = implode(" ",$html);
}
else {
$data = $html[0];
}
preg_match("/((.*?))(.*?)<meta name="description" content="SELFHTML-Forumsarchiv, Thread: (.*?)">(.*?) von <b>(.*?)</b>, ([0-9]{2}). ([0-9]{2}). ([0-9]{4}), ([0-9]{2}):([0-9]{2}) Uhr/",$data,$basic_data);
$data = urldecode(strip_tags($data));
$trans = get_html_translation_table (HTML_ENTITIES);
$trans = array_flip ($trans);
$data = strtr($data,$trans);
preg_match ("/ (.*) /",$data,$matches);
$data = $matches[1];
query("
INSERT INTO selfarchiv
SET id = ".$id.",
topic = '".mysql_escape_string($basic_data[1])."',
title = '".mysql_escape_string($basic_data[3])."',
body = '".mysql_escape_string($data)."',
name = '".mysql_escape_string($basic_data[5])."',
time = UNIX_TIMESTAMP('".$basic_data[8]."-".$basic_data[7]."-".$basic_data[6]." ".$basic_data[9].":".$basic_data[10].":00')
");
}
}
closedir($handle);
Mal ne ganz andere Frage: Wo kann ich unter Linux einstellen, welche Programe beim Starten geladen werden? Also mein dyndns client z.B.? den starte ich jetzt immer manuell aus der shell, das kann es ja nicht sein!
Viele Grüße
Andreas
PS: Meine Suche funktioniert im Prinzip(für Anwender) genaus so wie die originale, es wird halt nur etwas anders sortiert, und ich zeige nur einen Datensatz pro Thread an, und nicht pro Posting. Das war jetzt einfacher. Vielleicht als Notlösung wen die Self-Suche lahmt ;-)