Länge der Begriffe im Suchindex

Probleme bei der regulären Arbeiten mit phpBB, Fragen zu Vorgehensweisen oder Funktionsweise sowie sonstige Fragen zu phpBB im Allgemeinen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Benutzeravatar
Gérome
Mitglied
Beiträge: 69
Registriert: 08.08.2003 11:47
Wohnort: Hamburg
Kontaktdaten:

Länge der Begriffe im Suchindex

Beitrag von Gérome »

Hallo alle zusammen,

offenbar stehe ich gedanklich gerade auf dem Schlauch. Ich hatte im Hinterkopf das Wissen (?), dass der Such-Index vom phpBB keine Begriffe aufnimmt, die kürzer als 3 Zeichen oder länger als 20 Zeichen sind.
Nun suchte ich eben bei uns zufällig nach der '1' und siehe da: Mehr als 3.000 Threads als Such-Ergebnis. :o "Naja, hab' ich wohl die Routinen für den Such-Index kaputt gespielt." war mein erster Gedanke. Mitnichten. Bei Euch (und einigen anderen phpBB-Foren) geht's auch. :o
1

Also muss wohl meine Information falsch sein, dass diese Begriffe nicht in den Index aufgenommen würden. Doch ein Blick in die 'functions_search.php' zeigt:

Code: Alles auswählen

if ( $mode == 'post' )
{
	$entry = str_replace('*', ' ', $entry);
	// 'words' that consist of <3 or >20 characters are removed.
	$entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
}
Der Code ist da und wenigstens nach dem Kommentar soll er auch genau diese o.g. Worte rausfiltern.


Mein Problem liegt jetzt nicht darin, das von mir gewünschte Verhalten zu erzielen, sondern viel eher in der Frage, was ich hier jetzt falsch verstanden habe. Für einen großen Such-Index habe ich bei entsprechend vielen Beiträgen auch absolutes Verständnis, aber unser Index kam mir schon verdächtig groß vor - ist ja auch klar, wenn jeder Dödelkram mit eingebunden wird.


Grüße,
Gérome
Benutzeravatar
Underhill
Mitglied
Beiträge: 1180
Registriert: 24.09.2003 11:40
Wohnort: 742 Evergreen Terrace

Beitrag von Underhill »

Hmm,

koennte es sein das " 1 " bei der Suche ankommt und nur ein "trim($sentry);" fehlt?

Nur so'ne schnelle Idee...

Gruss
Underhill
Benutzeravatar
Gérome
Mitglied
Beiträge: 69
Registriert: 08.08.2003 11:47
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Gérome »

Moin Underhill,

ich habe eben in der Datenbank nachgesehen und meine Vermutung wurde bestätigt. Da steht tatsächlich nur eine '1' ohne Leerzeichen. (Gleiches gilt analog für alle anderen Ziffern sowie die einzelnen Buchstaben.)


Grüße,
Gérome
Benutzeravatar
Underhill
Mitglied
Beiträge: 1180
Registriert: 24.09.2003 11:40
Wohnort: 742 Evergreen Terrace

Beitrag von Underhill »

Jau,

bei mir auch (gerade getestet..)

Aber mach mal

Code: Alles auswählen

	if (( $mode == 'post' ) or ( $mode == 'search' ))
	{
		$entry = str_replace('*', ' ', $entry);

		// 'words' that consist of <3 or >20 characters are removed.
		$entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
	}
Und es geht... ($mode kommt bei der norm. Suche als "search" an...


Gruss
Underhill
Benutzeravatar
Gérome
Mitglied
Beiträge: 69
Registriert: 08.08.2003 11:47
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Gérome »

Moin Underhill,
Underhill hat geschrieben:Und es geht... ($mode kommt bei der norm. Suche als "search" an...
ja, aus dem Script 'search.php' heraus wird 'clean_words()' wir dem Parameter 'search' aufgerufen und Deine Änderung sorgt dann dafür, dass diese Zeichenfolgen aus den Suchbegriffen rausgezuppelt und damit folgerichtig auch nicht mehr gefunden werden.

Aaaaaaber: Im Such-Index selber sind diese Begriffe noch mit drin. (!)Hierfür ist nämlich die Funktion 'add_search_words()' aus dem Script 'functions_search.php' zuständig. Und dort erfolgt der Aufruf von 'clean_words()' tatsächlich mit dem Parameter 'post':

Code: Alles auswählen

$search_raw_words['text'] = split_words(clean_words('post', $post_text, $stopword_array, $synonym_array, $found_stop_words));
$search_raw_words['title'] = split_words(clean_words('post', $post_title, $stopword_array, $synonym_array, $found_stop_words));
Ich habe den regulären Ausdruck im Verdacht und ein Test-Script bestätigt es mir:

Code: Alles auswählen

<?php
$entry = 'Mein kleines ab in 99 0 1 String';
echo "Davor: *$entry*<br>";
$entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
echo "Danach: *$entry*<br>";
?>
Die Ausgabe:

Code: Alles auswählen

Davor: *Mein kleines ab in 99 0 1 String*
Danach: *Mein kleines in 0 String*
Die Ersetzung erfolgt nicht vollständig. Nun werde ich heute Abend mal in meinen Unterlagen zu den regulären Ausdrücken wühlen - so schwer kann die Korrektur nicht sein.


Grüße,
Gérome
Benutzeravatar
Underhill
Mitglied
Beiträge: 1180
Registriert: 24.09.2003 11:40
Wohnort: 742 Evergreen Terrace

Beitrag von Underhill »

Jepp,

sehe ich auch so :wink:

@phpBB.de - Mods:
Das waere dann auch was fuer den Bug Tracker... (denke ich)

Gruss
Underhill
Benutzeravatar
Gérome
Mitglied
Beiträge: 69
Registriert: 08.08.2003 11:47
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Gérome »

Mein Lösungsvorschlag (welcher jedoch aufgrund der Erkennung der 'word-boundaries' eine korrekte Ländereinstellung voraussetzt):

Code: Alles auswählen

$entry = preg_replace('/(\b)([\S]{1,2}|[\S]{21,})(\b)/',' ', $entry);
Der folgende Test schneidet dabei schon recht gut ab:

Code: Alles auswählen

<?php

setlocale( LC_ALL, 'de_DE' );

$entry = 'Mein kleines ab in 99 0 1 String Außenhandelsgroßvertreterkonferenztagebucheintragsversicherung';
echo "Davor: *$entry*<br>";
$entry = preg_replace('/(\b)([\S]{1,2}|[\S]{21,})(\b)/',' ', $entry);
echo "Danach: *$entry*<br>";
?>
Vielleicht findet ja wer noch eine elegantere Lösung und zur endgültigen Bewertung meines Ansatzes sind eh' noch weitere Tests nötig.


Grüße,
Gérome


P.S.: Angenommen, es wäre tatsächlich ein kleiner Bug und er wäre noch in keinem der einschlägigen Foren dokumentiert, dann wär' die Woche fast gerettet. ;-) (just kidding)
[edit] Schade - wurde schon bei phpBB.com diskutiert. [/edit]

P.P.S.: Ich lasse gerade mal in unserem Testforum den Such-Index mit dem geänderten Code neu aufbauen und werde dann am Abend berichten.
Benutzeravatar
Underhill
Mitglied
Beiträge: 1180
Registriert: 24.09.2003 11:40
Wohnort: 742 Evergreen Terrace

Beitrag von Underhill »

Hi,

was ist damit:

Code: Alles auswählen

<?php 
$entry = '1 Mein kleines ab in 99 1 2 String ein 1234567890123456789012'; 
echo "Davor: *$entry*<br>"; 
$entry = preg_replace('/((\s|^)\w{1,2}\b|(\s|^)\w{21,}\b)/', '', $entry); 
$entry = trim($entry);
echo "<pre>Danach: *$entry*</pre>"; 
?>
muesste alles drinn' sein :wink:
(pre wegen der leerzeichen)

Gruss
underhill
Benutzeravatar
Gérome
Mitglied
Beiträge: 69
Registriert: 08.08.2003 11:47
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Gérome »

Ich werde Deinen Code gerne testen - meiner ist noch nicht der Hit. Die Suchtabelle wird zwar um 25 MBytes kleiner, aber einige ungewünschte Einträge tummeln sich weiterhin in der DB. In dem von mir verlinklten Thread auf phpBB.com gibt es noch eine weitere Lösung anzugucken.

Ich stecke jedoch im Moment nicht tief genug in der Thematik drin, um die RegExpres qualitativ bewerten zu können und meine Zeit gestattet mir eine entsprechende Einarbeitung leider auch erst Ende der Woche.


Grüße,
Gérome
Benutzeravatar
Scotty
Mitglied
Beiträge: 1451
Registriert: 15.06.2005 03:54
Wohnort: Neuruppin
Kontaktdaten:

Beitrag von Scotty »

Gibt es hier schon was neues?
Scotty's .NET Projekte: StarTrek Infos X10, e-hahn Updater 3.10, Easy Desktop Note 1.06
Antworten

Zurück zu „phpBB 2.0: Administration, Benutzung und Betrieb“