Seite 3 von 6

Verfasst: 03.10.2006 17:42
von mgutt
ich gehe gerade step-by-step alles durch.

Als Verständnis. Der geht die Datenbank durch um "gewöhnliche" Wörter aus der Datenbank rauszuschmeißen. Und das macht der bei jedem neuen Post. Was ich schon alleine komisch finde aber egal.

Also hier nochmal der Übeltäter:

Code: Alles auswählen

$sql = "SELECT m.word_id 
				FROM " . SEARCH_MATCH_TABLE . " m, " . SEARCH_WORD_TABLE . " w 
				WHERE w.word_text IN ($word_id_sql)  
					AND m.word_id = w.word_id 
				GROUP BY m.word_id 
				HAVING COUNT(m.word_id) > $common_threshold";
Er sucht nun die Übereinstimmungen in w.word_text mit den angelieferten Wörtern aus $word_id_sql (die teilweise ungefilterte Wörter enthält, aber darauf komme ich später zurück), dann werden die Wörter nach ihrer Anzahl gruppiert, wobei aber nur die Wörter ausgelesen werden die mindestens so oft vorkommen wie es $common_threshold vorschreibt.

Danach werden diese Daten weiter verarbeitet. Erst werden die als "gewöhnlich" erkannten Wörter hier gekennzeichnet:

Code: Alles auswählen

			$sql = "UPDATE " . SEARCH_WORD_TABLE . "
				SET word_common = " . TRUE . " 
				WHERE word_id IN ($common_word_id)";
Danach in einer weiteren Tabelle entfernt:

Code: Alles auswählen

$sql = "DELETE FROM " . SEARCH_MATCH_TABLE . "  
				WHERE word_id IN ($common_word_id)";
Geht man nun in meinem Forum hin und sucht mal nach Wörtern, die gewöhnlich sind, fällt einem ins Auge, dass nicht ein einziges Wort als gewöhnlich erkannt wurde. Da drängt sich mir direkt die Frage auf, nach dem Sinn dieser Funktion.

Laut der Formel ist ein Wort nur dann gewöhnlich, wenn es in einem Viertel aller Posts vorkommt. D.h. es muss in 4 von 10 Posts vorkommen, damit wir uns von diesem Wort trennen können:

Code: Alles auswählen

$common_threshold = floor($row['total_posts'] * $fraction);
Ist es nicht auch schon hier das Problem, dass Wörter, die in 4 von 10 Posts vorkommen einen zu kleinen Maßstab darstellen?

Suche ich nun dank der Abfrage aus der Dokunach den häufigsten Wörtern in meinem Forum so bekomme ich z.B. diese Top 10:

Code: Alles auswählen

17 ich 101579 
27 und 87074 
65 die 84334 
6 das 83042 
34 der 70004 
272 ist 62721 
93 auch 62422 
113 nicht 57311 
87 aber 57225 
41 mal 50313
Das schlägt sich dann durch bis zu einer Anzahl von ca. 15.000 Vorkommnissen.

Also ist es bei mir tatsächlich so, dass mein "Gewöhnlichkeitsindex" 1/40 beträgt. Also wenn das Wort in zehn von 400 Beiträgen auftaucht, dann ist es gewöhnlich.

Ich könnte nun zwei Wege einschlagen. Einmal ich übernehme die gewöhnlichen Wörter in meine search_stopwords.txt und baue den Suchindex neu auf oder ich ändere die Formel für den Gewöhnlichkeitsindex.

Doch diese Änderung würde mir nicht wirklich weiterhelfen, denn die Abfrage würde ja in Zukunft dennoch generiert werden.

Also behaupte ich mal frech, dass diese Funktion eigentlich eine unnütze Bremse in phpBB ist (da sie ja eh nie greift) und die manuelle Änderung und Übernahme der Wörter in die stopwords viel hilfreicher wäre, da dann gar keine Abfrage generiert wird.

Was mich aber immer noch beschäftigt ist, dass sowohl die Wörter aus meiner "Top 10", der gewöhnlichsten Wörter und die Wörter die allgemein in der Abfrage sind gar nicht darin auftauchen dürften, da sie eh schon in der stopwords stehen. Also suche ich mal weiter...

Aber vorerst habe ich den Gewöhnlichkeitsindex in meiner search_functions.php verändert:

Code: Alles auswählen

	if ($mode == 'single')
	{
		remove_common('single', 1/40, $word);
	}
EDIT1:
In einem Post, der Übersichtlichkeit halber:

Ich hab in der functions_search.php mal versucht herauszufinden warum die stopwords eigentlich nicht greifen und das kann ich mir gerade mal überhaupt nicht erklären.

Also diesen Code habe ich platziert:

Code: Alles auswählen

	if ( !empty($stopword_list) )
	{
		for ($j = 0; $j < count($stopword_list); $j++)
		{
			$stopword = trim($stopword_list[$j]);

			if ( $mode == 'post' || ( $stopword != 'not' && $stopword != 'and' && $stopword != 'or' ) )
			{
				$entry = str_replace(' ' . trim($stopword) . ' ', ' ', $entry);
// mein Code zur Prüfung
if ($user->data['user_id'] == 2)
{
	echo('Der zu verarbeitende Eintrag: "');
	echo($entry . '"<br />');
	echo('Das erste Wort was zu ersetzen ist: "');
	echo($stopword . '"<br />');
	exit;
}
// Ende mein Code
			}
		}
	}
Tatsächlich greift die str_replace() nicht. Angezeigt wird auf der Seite das:
[ externes Bild ]

Dann lasse ich mir den Quelltext anzeigen:
[ externes Bild ]

Sehe ich das richtig?! Japanisch?!

Übrigens sieht der Spaß in Firefox ähnlich komisch aus:
[ externes Bild ]

Na was sagt ihr :lol:



EDIT2:

Tja, man glaubt es kaum. Das Problem ist simpel und wurde gelöst:

Die search_stopwords.txt hatte kein Format angegeben. Also sie war als reiner Datencontainer auf dem Server angegeben. Nun ist sie geändert auf plaintext und schon klappts. Nur dumm, dass das jetzt heißt, dass ich den kompletten Suchindex neu aufbauen muss.

Naja. Aber dann sollte der Server wieder rennen.

Gruß

Verfasst: 03.10.2006 18:36
von mgutt
*delete*

Verfasst: 03.10.2006 19:19
von Gumfuzi
soll das heissen, daß die "stopwords" in den searchtables auch gelistet werden?

Verfasst: 03.10.2006 19:26
von mgutt
schau bei "EDIT2".. habe das Problem lösen können.

Verfasst: 03.10.2006 19:32
von Gumfuzi
aha, danke!

P.S.: finde es klasse, dass Du Dich mit Optimierungen beschäftigst!!!

Verfasst: 03.10.2006 22:57
von mgutt
Ok, jetzt habe ich offensichtlich einen Fehler im Code gefunden. Und zwar kamen beim Neuaufbau des Suchindexes trotzdem noch zweistellige Wörter durch.

Naja dann habe ich den gelieferten Code gefiltert und dabei viel mir auf, dass die preg_replace Zeile fehlerhaft ist:

Code: Alles auswählen

<?php

$entry = 'es ja er es du da';
$entry = ' ' . strip_tags(strtolower($entry)) . ' ';
$entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
echo($entry);

?>
Ergebnis:

Code: Alles auswählen

ja es da
D.h. wenn nach einem 2-stelligen Wort noch eines folgt wird das folgende nicht herausgefiltert.

Mal sehen, ob das irgendwo schon angesprochen wurde.

Gruß

EDIT: Tatsächlich hat man das schon diskutiert. Aber der Fehler existiert schon seit 2 Jahren in phpBB. Wirklich verstehen kann ich das nicht.
http://www.phpbb.de/viewtopic.php?t=68093
http://www.phpbb.com/phpBB/viewtopic.php?t=208647

Verfasst: 04.10.2006 08:50
von Garfield312
mgutt hat geschrieben:Tja, man glaubt es kaum. Das Problem ist simpel und wurde gelöst:

Die search_stopwords.txt hatte kein Format angegeben. Also sie war als reiner Datencontainer auf dem Server angegeben. Nun ist sie geändert auf plaintext und schon klappts. Nur dumm, dass das jetzt heißt, dass ich den kompletten Suchindex neu aufbauen muss.
Hallo,

da ich auch teilweise massive Probleme mit der Serverlast habe, frage ich mich, ob diese Lösung, die du da gefunden hast, auch für andere Forenbetreiber hilfreich ist.

Leider geht dein kompletter Beitrag etwas über meinen Wissensstand hinaus.

Kann ich durch irgendeine Aktion an der search_stopwords.txt mein Forum beschleunigen ?

Falls ja, wäre es sehr nett, wenn du das kurz für Doofe erklären könntest :D

Danke :grin:

Verfasst: 04.10.2006 11:08
von mgutt
Also es war bei mir so, dass die Datei search_stopwords.txt keine Textdatei war, sondern ein Datencontainer. Soll heißen eine Datei ohne Format. Dies passiert eigentlich nur bei falscher Übertragung von Daten auf den Server oder wenn ein Script die Datei geschrieben hat. Ich kann mir das gerade nicht wirklich erklären wie es dazu kam.

Damit Du checken kannst, ob Deine stopwords greifen benutze diese Abfrage in phpmyadmin:

Code: Alles auswählen

SELECT ls.word_id, ls.word_text, COUNT(wm.word_id) as entries FROM `phpbb_search_wordlist` as ls LEFT JOIN `phpbb_search_wordmatch` as wm ON ls.word_id=wm.word_id GROUP BY wm.word_id ORDER BY entries DESC LIMIT 0,10
Sollten nun in der Top10 Wörter auftauchen, die Du auch in der stopword Textdatei hast, dann könnte deine Datei ebenfalls fehlerhaft sein.

Übrigens gibt es zwei Bugs in phpBB. Der eine lässt 2-stellige Wörter durch und der andere auch Wörter der Stopwordsliste.

Diese Bugs habe ich wie hier beschrieben gelöst:
http://www.phpbb.de/viewtopic.php?p=771897#771897

Mein Suchindex baut sich gerade neu auf, danach kann ich Dir sagen, was die Aktion genau gebracht hat. Das dauert aber noch ca. 32 Stunden, da meine Datenbank was größer ist.

Wenn es hilft, hier ist meine erweiterte Stopwordsliste:
http://www.maxrev.de/files/2007/11/search_stopwords.zip

Da sind einige gewöhnliche Begriffe mehr enthalten, als in der originalen von phpBB.de

Gruß

Verfasst: 04.10.2006 11:29
von thompson
das ergebnis würde mich auch näher interessieren. und vor allem was das performance mäßig gebracht hat. halt uns bitte auf dem laufenden.

Verfasst: 04.10.2006 11:29
von Garfield312
Danke für die Antwort.

Mein Server ist allerdings nicht in der Lage, diese Anweisung in phpmyadmin auszuführen. Nach ein paar Minuten wird mir eine Datei "import.php" zum Download angeboten (die leer ist).

Läßt das schon irgendwelche Rückschlüsse zu ?