Shad86 Posted September 4, 2014 Share Posted September 4, 2014 Ich habe ein kleines Problem mit der Front-Office Suche. Meine Artikelnummern sehen folgendermaßen aus: DP-01-2345-678 Wenn ich nur nach Teilen davon suche, wird es allerdings nicht gefunden. 01-2345-678 funktioniert zb. noch, 2345-678 nicht mehr. Und vor allem, gibt ein Kunde zb keine Bindestriche mit ein, DP012345678, wird auch nichts gefunden. Gibt es irgendeine Möglichkeit das ganze um zu setzen ohne die Artikelnummern nochmal in jeglicher kombination als Tag ein zu geben? Hofft auf hilfe, Shad Link to comment Share on other sites More sharing options...
eleazar Posted September 13, 2014 Share Posted September 13, 2014 (edited) Na, mach dir mal nicht zuviel Arbeit. Die eingebaute Suchfunktion erwartet immer ein Suchwort am Beginn des zu durchsuchenden Strings. Dabei gibt es auch unter UNIX ein Äquivalent zum Sternchen (*) in der Microsoft-Welt, nur ist das hier das %-Zeichen. Das sollte den Suchstring "einrahmen", damit es beliebige Zeichen davor und dahinter geben kann und das Gesuchte also auch inrgendwo mitten drin stehen kann. Bindestriche spielen da übrigens keine Rolle, die werden eh bei der Suche rausgefiltert. Um das abzustellen, sind nur kleine Änderungen erforderlich: /classes/Search.php In der public static function find() setzen wir an geeigneter Stelle das %-Zeichen ein, und zwar genau hier - und zwar in allen drei Zeilen, in denen ein "PSQL" steht. Statt FROM '._DB_PREFIX_.'search_word sw LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word WHERE sw.id_lang = '.(int)$id_lang.' AND sw.id_shop = '.$context->shop->id.' AND sw.word LIKE '.($word[0] == '-' ? ' \''.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'\'' : '\''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'\'' ); if ($word[0] != '-') $score_array[] = 'sw.word LIKE \''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'\''; } else unset($words[$key]);soll es heißen: foreach ($words as $key => $word) if (!empty($word) && strlen($word) >= (int)Configuration::get('PS_SEARCH_MINWORDLEN')) { $word = str_replace('%', '\\%', $word); $word = str_replace('_', '\\_', $word); $intersect_array[] = 'SELECT si.id_product FROM '._DB_PREFIX_.'search_word sw LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word WHERE sw.id_lang = '.(int)$id_lang.' AND sw.id_shop = '.$context->shop->id.' AND sw.word LIKE '.($word[0] == '-' ? ' \'%'.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' : '\'%'.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' ); if ($word[0] != '-') $score_array[] = 'sw.word LIKE \'%'.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'';Geändert wird also hier:? ' \'%'.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'': '\'%'.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\''und hier:$score_array[] = 'sw.word LIKE \'%'.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'';Damit findet man dann auch einen Teil deiner Artikelnummer, zumindest wie im Beispiel 2345-678 oder 2345678 oder auch 678, aber nicht 345-678!Eigentlich müsste man die ganze Suche ummodeln, denn der Operator LIKE braucht bei größeren Datenmenge einfach zu lange. Aber das würde jetzt zu weit führen ... Edited September 14, 2014 by eleazar (see edit history) 1 Link to comment Share on other sites More sharing options...
Shad86 Posted September 18, 2014 Author Share Posted September 18, 2014 Das klingt doch soweit richtig gut. Habe jetzt erstmal Urlaub aber wird danach direkt getestet. Danke dir. Aber wieso geht 345-678 nicht? Mit der Änderung wird die Artikelnummer also davor oder danach ergänzt, Bindestriche werden auch ergänzt? Aber was funktioniert dann an 345-678 nicht? Ist doch nur vorne noch eine weitere Ziffer weg gelassen worden. Link to comment Share on other sites More sharing options...
Shad86 Posted September 19, 2014 Author Share Posted September 19, 2014 Also ich hab die Änderung jetzt schon vorgenommen. Jetzt hab ich das Problem das die Suche geht solange ich noch nach einer kompletten Artikelnummer suche, ein Teil davon bewirkt allerdings das eine weiße Seite aufgerufen wird. :-/ Ich habe den ersten Code Schnipsel komplett durch den zweiten ersetzt. Das ist ja die Zusammenfassung wenn ich es richtig aufgefasst habe. Link to comment Share on other sites More sharing options...
Mutabor Posted September 20, 2014 Share Posted September 20, 2014 Blank page : Das deutet daraufhin, du hast da entweder was missverstanden oder dich nicht genau an die Anweisungen gehalten. Link to comment Share on other sites More sharing options...
Shad86 Posted October 20, 2014 Author Share Posted October 20, 2014 So, sorry für die späte Antwort: Ich habe wie gesagt den ersten, dritten und vierten Codeschnipsel gegen den zweiten ersetzt. Link to comment Share on other sites More sharing options...
onlineshopper Posted December 10, 2014 Share Posted December 10, 2014 Aber bitte beachten, dass die Abfrage in der Datenbank dadurch (wesentlich) langsamer werden kann. Sollte es also zu Performance-Problemen kommen und die Seite lädt langsamer als sonst, bitte auch mal daran denken. Grund: die Prozentzeichen in der Suchanfrage machen es der Datenbank-Software nicht mehr so einfach die Datenbank zu durchsuchen bzw. die Suchanfrage zu optimieren, da das ein Platzhalter für alle möglichen Zeichen ist. Link to comment Share on other sites More sharing options...
eleazar Posted December 10, 2014 Share Posted December 10, 2014 Aber bitte beachten, dass die Abfrage in der Datenbank dadurch (wesentlich) langsamer werden kann. Sollte es also zu Performance-Problemen kommen und die Seite lädt langsamer als sonst, bitte auch mal daran denken. Grund: die Prozentzeichen in der Suchanfrage machen es der Datenbank-Software nicht mehr so einfach die Datenbank zu durchsuchen bzw. die Suchanfrage zu optimieren, da das ein Platzhalter für alle möglichen Zeichen ist. Grundsätzlich stimme ich dir zu, aber das liegt weniger am Prozentzeichen als vielmehr daran, dass Prestashops Suchfunktion simpel gestrickt ist und mit LIKE arbeitet. Führende - nicht nachgeordnete! - Wildcards (z.B. "%Name") lassen dann die Suche über den Index nicht zu, so dass die ganze Datenbank durchforstet werden muss. Aber das hört sich schlimmer an, als es ist und bis zu einer gewissen Größenordnung kann man diesen Umstand vernachlässigen. Getestet habe ich mit etwa 20.000 Artikeln ohne erkennbare Performance-Einbußen. Oder hast du andere Werte? In jedem Fall solltest du vielleicht auch genau angeben, ab welcher Shopgröße deiner Ansicht nach eine Verlangsamung zu befürchten ist. Denn ich vermute mal, die meisten Prestashops sind zu klein, als dass solche Probleme überhaupt auftreten. Link to comment Share on other sites More sharing options...
onlineshopper Posted December 10, 2014 Share Posted December 10, 2014 Das ist natürlich völlig richtig. Der Hinweis gilt wirklich nur für große Shops mit über 50.000 Artikeln, die auch sehr viel Traffic haben. Denn selbst wenn die einzelne Suchanfrage langsam ist, bemerkt man das natürlich nicht so schnell, wenn man kaum Traffic auf der Seite hat. Konkrete Zahlen kann ich dir leider nicht nennen. Wollte den Hinweis nur mal in den Raum werfen für alle die diese Änderung nutzen. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now