Seite 1 von 2

Länge der Begriffe im Suchindex

Verfasst: 17.10.2004 18:41
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

Verfasst: 17.10.2004 19:34
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

Verfasst: 18.10.2004 08:29
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

Verfasst: 18.10.2004 10:44
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

Verfasst: 18.10.2004 11:54
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

Verfasst: 18.10.2004 12:02
von Underhill
Jepp,

sehe ich auch so :wink:

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

Gruss
Underhill

Verfasst: 18.10.2004 12:26
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.

Verfasst: 18.10.2004 14:31
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

Verfasst: 18.10.2004 19:04
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

Verfasst: 24.08.2005 14:36
von Scotty
Gibt es hier schon was neues?