Jump to content

Suche nach Teilen von Artikelnummer


Shad86

Recommended Posts

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

  • 2 weeks later...

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 by eleazar (see edit history)
  • Like 1
Link to comment
Share on other sites

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

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

  • 1 month later...
  • 1 month later...

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...