Guten Morgen, gibt es die Möglichkeit die Mindestlänge der Suchanfragen fest zu schreiben ? @humpfle Da Du schribst, daß sich Deine Verbesserungen mit sirtet kombinieren lassen, werde ich mich diese Woche mal ran setzen und umsetzen. Dazu melde ich mich dann wieder. VG Ralf
http://www.gambio-forum.de/threads/12773-Fehlertolerante-Suche-für-GX2?highlight=Suche Man sollte von allen das Beste nehmen und "eine" Top-Version erstellen!
Guten Morgen Steffen, bin begeistert von deinem neuen Modul, eine Frage habe ich noch: Verträgt es sich auch mit dem Modul/Tool von sirtet. Dieses habe ich nämlich bei uns schon installiert.
Na dann los , du hast doch meine Daten . Steffen du weißt doch, du bist für uns der Größte, selbst bei Problemen bei denen uns Gambio nicht mehr helfen konnte, hast du weiter gewußt.
Es gibt keine Probleme mit dem Modul von Sirtet und Steffen. Beide Sachen arbeiten auf www.das-ebook24.de friedlich zusammen. ;-) Gruß Ralf
Danke für das coole Modul, die Idee ist spitze! Es funktioniert so wie es soll, jedoch kommt in unserem Fall das Problem zum Tragen, dass wir den Shop zweisprachig betreiben. Einerseits werden Ergebnisse doppelt (in jeder Sprache) angezeigt (siehe Anhang), andererseits werden im englischen Shop deutsche Ergebnisse präsentiert. Heißt es steht bspw. "Kategorien:", "Hersteller:" usw. in den Vorschlägen der englischen Seiten. Gibt es da eine Möglichkeit das anzupassen?
Die Titel sind in der html datei, einfach zu finden. wie man das nach Sprachen unterteilt sollte man auch leicht ergoogeln / an anderen Stellen abschauen können. Doppelte Ergebnisse gibts nur in den kategorien (und hersteller?) nehme ich an? Das sieht man wohl in der php datei, dass da keine Sprachabfrage gemacht wird, ich hab nur eine Sprache. Sollte auch recht leicht machbar sein. Ich hab aber momentan keine Zeit dazu. Und auch kein Shop mit sprachen, um's beim programmieren zu testen.
Um meine Erweiterte AJAX-Suche unter 2.1 zum laufen zu bringen, muss man neu nicht mehr die /gm/ajax/live_search.php bearbeiten, sondern die system/classes/search/LiveSearchAjaxHandler.inc.php Sie enthält die beinahe identischen SQL-Abfragen, sie sind einfach neu verpackt in einer Klasse. Momentan sieht die Datei bei mir so aus (Stand 2.1.4.0): PHP: <?php /* -------------------------------------------------------------- LiveSearchAjaxHandler.inc.php 2012-01-31 mb Gambio GmbH http://www.gambio.de Copyright (c) 2012 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] -------------------------------------------------------------- */ class LiveSearchAjaxHandler extends AjaxHandler { function get_permission_status($p_customers_id=NULL) { return true; } function proceed() { if(defined('_GM_VALID_CALL') === false) die('x0'); $f_needle = $this->v_data_array['GET']['needle']; $t_needle = stripslashes($f_needle); $c_needle = mysql_real_escape_string($t_needle); $module_content = array(); $t_group_check = ''; if (GROUP_CHECK == 'true') { $t_group_check = " and p.group_permission_".(int)$_SESSION['customers_status']['customers_status_id']."=1 "; } // BOF toro: search manufacturers $result = xtc_db_query(' SELECT DISTINCT m.manufacturers_id AS manufacturers_id, m.manufacturers_name AS manufacturers_name, m.manufacturers_image AS manufacturers_image FROM manufacturers m WHERE m.manufacturers_name LIKE "%'.$c_needle.'%" ' . $t_group_check . ' ORDER BY m.manufacturers_name LIMIT 0,6 '); while(($row = xtc_db_fetch_array($result) )) { $row_data = array ( 'MFG_ID' => $row['manufacturers_id'], 'MFG_URL' => DIR_WS_CATALOG . 'index.php?manufacturers_id=' . $row['manufacturers_id'], 'MFG_NAME' => $row['manufacturers_name'] ); if ($row['manufacturers_image']) { $row_data['MFG_IMAGE'] = DIR_WS_IMAGES . $row['manufacturers_image'] ; } $module_content_mfg[] = $row_data; } // EOF toro: search manufacturers // BOF toro: search categories $result = xtc_db_query(' SELECT DISTINCT c.categories_id AS categories_id, cd.categories_name AS categories_name, c.categories_image AS categories_image FROM categories c, categories_description cd WHERE c.categories_status = 1 AND c.categories_id = cd.categories_id AND (cd.categories_name LIKE "'.$c_needle.'%" OR cd.categories_description LIKE "%'.$c_needle.'%" OR cd.categories_heading_title LIKE "%'.$c_needle.'%" OR cd.categories_meta_title LIKE "%'.$c_needle.'%" OR cd.categories_meta_description LIKE "%'.$c_needle.'%" OR cd.categories_meta_keywords LIKE "%'.$c_needle.'%" ) ' . $t_group_check . ' ORDER BY cd.categories_name LIMIT 0,4 '); while(($row = xtc_db_fetch_array($result) )) { $row_data = array ( 'CAT_ID' => $row['categories_id'], 'CAT_URL' => xtc_href_link(FILENAME_DEFAULT, xtc_category_link($row['categories_id'], $row['categories_name'])), 'CAT_NAME' => $row['categories_name'] ); if ($row['categories_image']) { $row_data['CAT_IMAGE'] = DIR_WS_IMAGES . 'categories/' . $row['categories_image'] ; } $module_content_cat[] = $row_data; } // EOF toro: search categories $t_attr_from = ''; $t_attr_where = ''; if(SEARCH_IN_ATTR == 'true') { $t_attr_from .= " LEFT OUTER JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " AS pa ON (p.products_id = pa.products_id) LEFT OUTER JOIN " . TABLE_PRODUCTS_OPTIONS_VALUES . " AS pov ON (pa.options_values_id = pov.products_options_values_id) LEFT OUTER JOIN products_properties_combis AS ppc ON (p.products_id = ppc.products_id) LEFT OUTER JOIN products_properties_index AS ppi ON (p.products_id = ppi.products_id) "; $t_attr_where .= "OR pa.attributes_model LIKE ('%".$c_needle."%') "; $t_attr_where .= "OR ppc.combi_model LIKE ('%".$c_needle."%') "; $t_attr_where .= "OR (ppi.properties_name LIKE ('%".$c_needle."%') "; $t_attr_where .= "AND ppi.language_id = '".(int) $_SESSION['languages_id']."')"; $t_attr_where .= "OR (ppi.values_name LIKE ('%".$c_needle."%') "; $t_attr_where .= "AND ppi.language_id = '".(int) $_SESSION['languages_id']."')"; $t_attr_where .= "OR (pov.products_options_values_name LIKE ('%" . $c_needle . "%') AND pov.language_id = '". (int)$_SESSION['languages_id'] . "')"; } $t_desc_where = ''; if (SEARCH_IN_DESC == 'true') { $t_desc_where .= "OR pd.products_description LIKE ('%". $c_needle ."%') "; $t_desc_where .= "OR pd.products_short_description LIKE ('%". $c_needle ."%') "; } // search in products name and model(=SKU) only, these will rank higher than matches in descriptions $result = xtc_db_query(' SELECT DISTINCT pd.products_id AS products_id, pd.products_name AS products_name, p.products_image AS products_image FROM products p ' . $t_attr_from . ', products_description pd WHERE p.products_status = 1 AND p.products_id = pd.products_id AND (pd.products_name LIKE "%' . $c_needle . '%" OR p.products_model LIKE ("%'.$c_needle.'%") OR p.products_ean LIKE ("%'.$c_needle.'%") ' . $t_desc_where . ' ' . $t_attr_where . ') AND pd.language_id = "' . (int)$_SESSION['languages_id'] . '" ' . $t_group_check . ' ORDER BY pd.products_name LIMIT 0,10 '); while(($row = xtc_db_fetch_array($result) )) { $row_data = array ( 'PRODUCTS_ID' => $row['products_id'], 'PRODUCTS_URL' => xtc_href_link(FILENAME_PRODUCT_INFO, xtc_product_link($row['products_id'], $row['products_name']) ), 'PRODUCTS_NAME' => $row['products_name'] ); if ($row['products_image']) { $row_data['PRODUCTS_IMAGE'] = DIR_WS_IMAGES . 'product_images/gallery_images/' . $row['products_image'] ; } $module_content[] = $row_data; } // search in products descriptions and attributes only (plus EAN) $result = xtc_db_query(' SELECT DISTINCT pd.products_id AS products_id, pd.products_name AS products_name, p.products_image AS products_image FROM products p ' . $t_attr_from . ', products_description pd WHERE p.products_status = 1 AND p.products_id = pd.products_id AND (p.products_ean LIKE ("'.$c_needle.'%") ' . $t_desc_where . ' ' . $t_attr_where .') AND pd.language_id = "' . (int)$_SESSION['languages_id'] . '" ' . $t_group_check . ' ORDER BY pd.products_name LIMIT 0,6 '); while(($row = xtc_db_fetch_array($result) )) { $row_data = array ( 'PRODUCTS_ID' => $row['products_id'], 'PRODUCTS_URL' => xtc_href_link(FILENAME_PRODUCT_INFO, xtc_product_link($row['products_id'], $row['products_name']) ), 'PRODUCTS_NAME' => $row['products_name'] ); if ($row['products_image']) { $row_data['PRODUCTS_IMAGE'] = DIR_WS_IMAGES . 'product_images/gallery_images/' . $row['products_image'] ; } $module_content[] = $row_data; } // remove duplicates from the different searches $module_content = array_unique($module_content, SORT_REGULAR); if(sizeof($module_content) > 0 OR sizeof($module_content_mfg) > 0 OR sizeof($module_content_cat) > 0) { $smarty = new Smarty; if(sizeof($module_content) > 0 ) { $smarty->assign('module_content', $module_content); } if(sizeof($module_content_mfg) > 0 ) { $smarty->assign('module_content_mfg', $module_content_mfg); } if(sizeof($module_content_cat) > 0 ) { $smarty->assign('module_content_cat', $module_content_cat); } $smarty->assign('language', $_SESSION['language']); $smarty->caching = 0; $this->v_output_buffer = $smarty->fetch(CURRENT_TEMPLATE.'/module/gm_live_search.html'); } return true; } } ?>
Hi zusammen, klasse Idee und sieht toll aus, aber irgendwie will es nicht unter 2.2 laufen. Hast du es schon zum Laufen gebracht ? Würde mich freuen von dir zu lesen. Sonnige Grüße Oktay
Die Schnellsuche ansich ist eigentlich in ihrer Arbeitsweise strafbar!!! Wenn man in die Schellsuche nicht genau das eingibt wie es im Namen oder Description oder Keywords steht, zeigt die nix mehr an. Das ist nicht unbedingt das was man eine vernünftige Suche nennt. Aber, nicht meckern sondern machen! Ich hab mir das ganze mal etwas intensiver angesehen und auf eine Entwicklungsumgebung bei uns versucht umzusetzen. Ich hab den Ablauf mir folgend vorgestellt! Gibt man Suchbegriffe in die Schnellsuche ein, soll es irrelevant sein in welcher Reihenfolge die Suchwörter kommen! Beispiel: Kunde benötigt das: Michelin ALPIN 5 205/55R16 91H TL Nun müsste er die fasst genauso eingeben das die Schnellsuche auch Ergebnisse liefert. Gibt er es so ein: 205 michelin 55 91 alpin -> dann ist Schicht im Schacht!!! Und genau das macht meine Suche jetzt schon nicht mehr! Das funktioniert auch schon fantastisch, wie die erste Abbildung zeigt: Sollte es sich dann herrausstellen das nichts vorhanden ist was den eingaben entspricht, greift eine Suchkombination aus levenshtein(), similar_text() und metaphone(). Diese erzeugt aber keine Artikelvorschläge sondern Suchbegriffvorschläge mit den % als Angabe wie der eingegebene Wert den vorhandenen gleicht und die Anzahl der dafür gefundenen Artikel. Das ist für uns bei knapp 112000 Artikeln noch etwas zu langsam und wird noch stark optimiert werden müssen, da dies immer knapp 3-4 sec dauert. Aber es funktioniert schon mal, siehe 2. Bild: Wird sicherlich noch bissl dauern eh das live gehen kann aber es ist ein unabhängiges Tool ohne Fremdanbieter.
Wie geil ist das denn?! Ich wusste nichtmal dass es solche exotischen PHP Funktionen wie metaphone() gibt! Steffen, das hört sich echt super an was du da planst. Und das wird dann als Kaufmodul angeboten?
Mal schauen! Kaufmodul is scheisse, da ich den Support nicht abdecken kann! Wird wohl frei verschenkt werden... Problem im Moment ist, das wir bei reifen24 alle relevanten Daten in der DB einzeln haben und diese automatisch als Suchbegriffe in eine extra Spalte schreiben. Das dauert bei allen Artikeln im Moment ca. 30sec... Also relativ schnell für 112000 Artikel. Es geht aber auch schon so, das das php-Skript den Namen und die Keywords durchläuft, auseinander nimmt und sich fertige Kombinationen selbst erstellt. Das möchte ich nun noch so erweitern das da schon eine gewisse Fehlertolleranz ausgearbeitet wir. Ist etwas schwieriger als gedacht, weil ich ja nicht weis was die Leute alles für Mist da reinschreiben. Also wird es dann noch eine 2. Funktion geben, wo anhand der Internen Suche, die Angaben durchlaufen werden und dann als fertige Suchergebnisse vorgehalten werden. Das ist schon relativ schwierig aber machbar. Fackt ist ein, es wird so ähnlich funktionieren wie die Suchen bei Amazon und co aber ganz so sauber schaffen wir das nicht. Wobei die meisten sicherlich auch nicht millionen von Artikeln haben werden.
Ich mich auch! Und kannst du auch von sirtet mit einbauen, dass Treffer mit exakten Treffern im Artikel Namen in den Ergebnissen höher platziert werden als exakte Treffer in Beschreibung oder Attributen? (Link nur für registrierte Nutzer sichtbar.)