Suchfunktion (fulltext nativ) - Umlaute und G/K-Schreibung
Verfasst: 14.10.2011 07:14
Hallo,
folgende Ausgangsitation: Frisch installiertes PHPBB3. Die Suchfunktion ist auf fulltext nativ eingestellt. Ein Forum mit einem Thread und einer Antwort:
[Thread 1]Test
ÜBUNG macht den Meister.
---------------------------------
[Antwort]Re: Test
übung macht den Meister.
Versuch A: Gibt man nun den Suchbegriff Übung ein erhält man:
Man beachte, dass das Wort nun kleingeschrieben ist. Auch in dem HTML-Text-Input-Feld der Suche steht nun übung. Als Treffer wird präsentiert:
Aus dem kleinen Umlaut ü wurde ein ue. Auch in dem HTML-Text-Input-Feld der Suche steht nun uebung. Als Treffer wird präsentiert:
Was man doch erwarten würde wären 2 Treffer, egal wie man Übung nun schreibt? Und das Übung in der Wortliste nur einmal auftaucht.
Ist das Verhalten von PHPBB korrekt?
Stellt man die Suche auf fulltext mysql um, erhält man 2 Treffer - egal wie man Übung schreibt.
Die entsprechende SQL-Abfrage sieht folgender Maßen aus:
Da das Feld post_text in der Tabelle phpbb_posts hat die Collation utf8_unicode_ci hat und nicht utf8_bin, wird bei dieser Abfrage nicht zwischen Groß- und Kleinschreibung unterschieden.
(siehe auch: http://dev.mysql.com/doc/refman/5.1/de/ ... earch.html)
In der Datei search.php findet man folgende Zeile (bei mir Zeile 297):
Je nach dem welche Suchengine eingestellt ist wird die eine oder andere Funktion "split_keywords" benutzt.
Kleine Debuginfos zur Nativen Suche:
($keywords schnappt sich die GET-Variable: $keywords= utf8_normalize_nfc(request_var('keywords', '', true));)
Und zur Fulltext Suche:
Also wird eindeutig durch die implementierung in der Funktion split_keywords bzw. cleanup in der Klasse fulltext_native in der Datei includes/search/fulltext_native.php der Suchebegriff verändert, nicht etwa durch die URL/Browser. Da die beiden Funktionen auch für die Indizierung genommen werden, entstehen die Unterschiedlichen Wörter in der Wortliste (phpbb_search_wordlist).
Also nochmal gefragt: Sollte PHPBB nicht korrekterweise ÜBUNG und übung als ein Wort indizieren?
Oder liegt es an meinen Einstellungen/System?
Infos zum System:
barra
folgende Ausgangsitation: Frisch installiertes PHPBB3. Die Suchfunktion ist auf fulltext nativ eingestellt. Ein Forum mit einem Thread und einer Antwort:
[Thread 1]Test
ÜBUNG macht den Meister.
---------------------------------
[Antwort]Re: Test
übung macht den Meister.
Versuch A: Gibt man nun den Suchbegriff Übung ein erhält man:
Die Suche ergab 1 Treffer: übung
Man beachte, dass das Wort nun kleingeschrieben ist. Auch in dem HTML-Text-Input-Feld der Suche steht nun übung. Als Treffer wird präsentiert:
Versuch B: Gibt man den Suchbegriff übung ein erhält man:Test
ÜBUNG macht den Meister.
Die Suche ergab 1 Treffer: uebung
Aus dem kleinen Umlaut ü wurde ein ue. Auch in dem HTML-Text-Input-Feld der Suche steht nun uebung. Als Treffer wird präsentiert:
Schaut man sich dazu die Tabelle phpbb_search_wordlist an sieht man auch, dass das Wort Übung in verschiedenen Ausführungen indiziert wurde:Re: Test
übung macht den Meister.
Code: Alles auswählen
word_id word_text word_common word_count
1 übung 0 1
2 macht 0 2
3 den 0 2
4 meister 0 2
5 test 0 2
6 uebung 0 1
Ist das Verhalten von PHPBB korrekt?
Stellt man die Suche auf fulltext mysql um, erhält man 2 Treffer - egal wie man Übung schreibt.
Die entsprechende SQL-Abfrage sieht folgender Maßen aus:
Code: Alles auswählen
SELECT SQL_CALC_FOUND_ROWS p.post_id FROM phpbb_posts p WHERE MATCH (p.post_subject, p.post_text) AGAINST ('+Übung ' IN BOOLEAN MODE) AND p.post_approved = 1 ORDER BY p.post_time DESC
(siehe auch: http://dev.mysql.com/doc/refman/5.1/de/ ... earch.html)
In der Datei search.php findet man folgende Zeile (bei mir Zeile 297):
Code: Alles auswählen
$correct_query = $search->split_keywords($keywords, $search_terms);
Kleine Debuginfos zur Nativen Suche:
($keywords schnappt sich die GET-Variable: $keywords= utf8_normalize_nfc(request_var('keywords', '', true));)
Code: Alles auswählen
Suchbegriff: Übung
URL: http://localhost/phpbb3_test/search.php?keywords=Übung
$keywords : Übung
$search->search_query : übung (nach Aufruf von split_keywords)
SQL: SELECT word_id, word_text, word_common FROM phpbb_search_wordlist WHERE word_text = 'übung' ORDER BY word_count ASC
-------------------------------------------------------------------------------------
Suchbegriff: übung
URL: http://localhost/phpbb3_test/search.php?keywords=übung
$keywords : übung
$search->search_query : uebung (nach Aufruf von split_keywords bzw. cleanup)
SELECT word_id, word_text, word_common FROM phpbb_search_wordlist WHERE word_text = 'uebung' ORDER BY word_count ASC
Code: Alles auswählen
Suchbegriff: Übung
URL: http://localhost/phpbb3_test/search.php?keywords=Übung
$keywords : Übung
$search->search_query : +Übung (nach Aufruf von split_keywords)
-------------------------------------------------------------------------------------
Suchbegriff: übung
URL: http://localhost/phpbb3_test/search.php?keywords=übung
$keywords : übung
$search->search_query : +übung (nach Aufruf von split_keywords bzw. cleanup)
Also nochmal gefragt: Sollte PHPBB nicht korrekterweise ÜBUNG und übung als ein Wort indizieren?
Oder liegt es an meinen Einstellungen/System?
Infos zum System:
- Windows 7 64Bit
- PHPBB 3.0.9
- PHP Version 5.2.11 (Apache 2.0 Handler)
- MySQL 5.1.44-community-log
- Firefox 7.0.1
barra