Shop Support News Archive - Shopbetreiber News -> Forum : xt eCommerce Templates Module SEO Support: Templates, Module, Frage: Suchabfrage Optimieren
So viellenicht?
****//build query
****$select_str = "SELECT ";
****$from_str**= "FROM ".TABLE_PRODUCTS." AS p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." AS pd ON (p.products_id = pd.products_id) ";
****
****//where-string
****$where_str = " WHERE p.products_status = '1' "." AND pd.language_id = '".(int) $_SESSION['languages_id']."'".$subcat_where.$fsk_lock.$manu_check.$group_check. $tax_where.$pfrom_check.$pto_check;
****//go for keywords... this is the main search process
****if (isset ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) {
********if (xtc_parse_search_string(stripslashes($_GET['keywords']), $search_keywords)) {
************$where_str .= " AND ";
************for ($i = 0, $n = sizeof($search_keywords); $i < $n; $i ++) {
****************switch ($search_keywords[$i]) {
********************case '(' :
********************case ')' :
********************case 'and' :
********************case 'or' :
************************$where_str .= " \"".$search_keywords[$i]."\" ";
************************break;
********************default :
************************$where_str .= "INSTR(pd.products_keywords,".addslashes($search_keywords[$i]).") >1 ";
************************if (SEARCH_IN_DESC == 'true') {
************************** $where_str .= "OR INSTR(pd.products_description,".addslashes($search_keywords[$i]).") >1 ";
************************}************************
************************$where_str .= "OR INSTR(pd.products_name,".addslashes($search_keywords[$i]).") >1 ";
************************$where_str .= "OR INSTR(p.products_model,".addslashes($search_keywords[$i]).") >1 ";
************************break;
****************}
************}
************$where_str .= " ORDER BY p.products_id ";
********}
****}
nein :(
zwar fehlerfrei, aber dauert leider doppelt so lange wie die normale abfrage
''>ZITAT(DeeCoo @ Feb 3 2007, 13:16) 20110
da unsere Produktpalette nun knappe 100.000 Artikel umfasst und die Suchabfrage nun sehr zu wünschen übrig lässt, habe ich vor meine suchabfrage etwas zu optimieren, und folgendes überlegt.
[/b]
100.000 ist wirklich heftig. Für dermaßen viele Produkte ist xtc gar nicht geschaffen. Mal über'n schnelleren Server nachgedacht? Sind die betreffenden Felder der Suchanfrage indiziert?
Evt. kann man auch mal über einen gänzlich anderen Ansatz nachdenken die Suche zu realisieren. Ich denke an eine vorgelagerte Suche. Ungefähr so. Alle Wörter werden in einem vorausgehenden Arbeitsgang in einer eigenständigen Tabelle gespeichert mit Referenz zu den Artikeln worin diese vorkommen. Nun müssen die Suchwörter in der Tabelle gefunden werden und man hat die Referenzen zu den Artikeln.
Gruß
Hen
fiese möpp
04.02.2007, 00:40
Fülle die pd.products_keywords mit allen relevanten Daten aus der pd.products_description und lasse die Suche nur auf die p.products_model und pd.products_keywords suchen.
so Wörter wie der, die, das, unser, alle usw. brauchen da nicht rein.
Ansonsten kannst Du auch mehrmals suchen lassen.
1. Suche nur p.modell und pd.products_keywords. Wenn Treffer vorhanden, gebe sie aus. Ggf. ein Link "unschärfer" (wie bei Heise).
2. Keine Trefferbei 1, dann suche auf pd.products_description.
Dadurch hast du bei den meisten Suchanfragen relativ schnell treffer. Wenn etwas gesucht wird, was nicht unter 1 fällt, dann dauert es länger.
Oder Du speicherst alle Suchanfragen in der Datenbank, wertest diese irgendwann aus, und legst einen Suchindex an.
Hier ist bereits ein Ansatz. (http://www.ecombase.de/forum/index.php?showtopic=1511&hl=)
hmmm, naja komplette umprogrammierung sozusagen :/
nur was ich nicht verstehe is, das wenn ich über phpmyadmin abfrage handelt es sich um 0,02 sekunden Dauer, über der Oberfläche um die 6-10 sekunden, was ehrlich gesagt zu lange dauert, zumal man auch in den Suchergebnissen blättern kann und die eben genau so dauert.
Kann man den query nicht einfach etwas abspecken?
Also wenn Zahlen eingegeben werden dann such nur in product_model und bei einer gemischten Eingabe dann eben in nur name/description und ean. ohne check .. ist der Artikel verfügbar/bist du 18/welche kundegruppe/
da ich meinen sogenannten VÖ Browser auch über die Suche steurere (ich weiss das es unsinnig is), dauert dieser ja somit auch zu lange.
Gibt es da eine Möglichkeit einen extra Select zu basteln ? das der genau weiss was er zeigen soll also Februar 2007 =
SELECT FROM `products` WHERE `products_date_added` LIKE "2007-02%";
zumal ich mir dieses auch als zukünftiges Modul vorstellen kann "Produkte erschienen im (auswahl)Monat/Jahr"
Für eine Hilfe wäre ich sehr dankebar!
Gruss DeeCoo
fiese möpp
04.02.2007, 15:32
''>ZITAT(DeeCoo @ Feb 4 2007, 13:06) 20132
hmmm, naja komplette umprogrammierung sozusagen :/
nur was ich nicht verstehe is, das wenn ich über phpmyadmin abfrage handelt es sich um 0,02 sekunden Dauer, über der Oberfläche um die 6-10 sekunden, was ehrlich gesagt zu lange dauert, zumal man auch in den Suchergebnissen blättern kann und die eben genau so dauert.
[/b]
PHPMyAdmin zeigt die Zeit an, welche MySQL braucht und XTC zeigt die komplette Parsezeit an mit aufbereiten der Daten anpassen an HTML usw.
Suche in 'split_page_results.php' nach
******$count_query = xtDBquery($query);
******$count = xtc_db_num_rows($count_query,true);
ersetze mit
$time=time();
******$count_query = xtDBquery($query);
******$count = xtc_db_num_rows($count_query,true);
echo time()-$time;
nun bekommst Du die Sekunden angezeigt, wie lange MySQL rödelt.
Wenn es hier zulange dauert, dann versuche mal in der 'split page_result.php'
$count_query = xtDBquery($query);
ersetzen mit
$count_query = xtDBquery($query.' Limit 0,100');
Nun werden nur die ersten 100 Ergebnisse angezeigt (hoffe ich). Sollte dann dementsprechend schneller gehen. Eine Sortierung nach Datum währe dann recht nett, damit man neue Produkte als erstes sieht.
Dann kann man sich ja noch überlegen, ob man ein 'unschärfer' Flag dazumacht und dementsprechend die Limitierung aufhebt.
''>ZITAT</div>
Kann man den query nicht einfach etwas abspecken?
Also wenn Zahlen eingegeben werden dann such nur in product_model und bei einer gemischten Eingabe dann eben in nur name/description und ean. ohne check .. ist der Artikel verfügbar/bist du 18/welche kundegruppe/
[/b]
Klar. Einfach die Where Bedingungen raus.
Wenn Du nur ein Sprache hast, kannst Du auch die language_id sparen. Oder noch besser eine Products-Tabelle, die auch die Daten der Products_description enthält. Dann brauchst Du nicht mehr zwei Tabellen zu verknüpfen. Dürfte einiges bringen.
Die Suche in Kategorien und deren Unterkategorien ist auch recht aufwendig. Wenn möglich, weg damit.
''>ZITAT</div>
da ich meinen sogenannten VÖ Browser auch über die Suche steurere (ich weiss das es unsinnig is), dauert dieser ja somit auch zu lange.
Gibt es da eine Möglichkeit einen extra Select zu basteln ? das der genau weiss was er zeigen soll also Februar 2007 =
SELECT FROM `products` WHERE `products_date_added` LIKE "2007-02%";
zumal ich mir dieses auch als zukünftiges Modul vorstellen kann "Produkte erschienen im (auswahl)Monat/Jahr"
[/b]
?
''>ZITAT</div>
Für eine Hilfe wäre ich sehr dankebar!
Gruss DeeCoo
[/b]
Viellenicht kann man auch irgendwie google ausnutzen und dessen Suchergebnisse nehmen. Einige Seiten machen dies ja. Habe davon aber keine Ahnung. Denke mit einer vernünftigen Sitemap kommen auch von google vernünftige Treffer.
Hast du denn schon mal alle Möglichkeiten ausgenutzt, die Parsetime zu verbessern?
Originally posted by fiese möpp+-->''>ZITAT(fiese möpp)</div>Nun werden nur die ersten 100 Ergebnisse angezeigt (hoffe ich). Sollte dann dementsprechend schneller gehen.[/b]Ob mit Limit oder ohne er bringt immer so um die (Parse Time: 9.155s)
bei Originally posted by fiese möpp+-->''>ZITAT(fiese möpp)</div>echo time()-$time;[/b]zeigt er immer 1 an
Originally posted by fiese möpp
Eine Sortierung nach Datum währe dann recht nett, damit man neue Produkte als erstes sieht.hab ORDER BY p.products_date_added DESCsollte somit gegeben sein
Originally posted by fiese möpp
Klar. Einfach die Where Bedingungen raus.
Wenn Du nur ein Sprache hast, kannst Du auch die language_id sparendie where abfragen hab ich soweit schon rausgenommen.
<!--QuoteBegin-fiese möpp@
Dann kann man sich ja noch überlegen, ob man ein 'unschärfer' Flag dazumacht und dementsprechend die Limitierung aufhebt.nix versteht oO
<!--QuoteBegin-fiese möpp
Oder noch besser eine Products-Tabelle, die auch die Daten der Products_description enthält. Dann brauchst Du nicht mehr zwei Tabellen zu verknüpfen. Dürfte einiges bringen.da frage ich mich sowieso warum das alles in "1000" verschiedenen tabellen gebaut wurde ... (nichts für ungut Harald Ponce de Leon ;) )
Originally posted by fiese möpp
?sry aber wenn ich mir diesen Satz so noch mal durchlese, verstehe ich Deinen fragenden Ausdruck :)
ich meinte damit sowie bei den herstellerpulldown ... wählen und ausgeben , nicht wie ich es mach per <option value="advanced_search_result.php?keywords=2006-01">Januar****2006</option>
Originally posted by danillo
Hast du denn schon mal alle Möglichkeiten ausgenutzt, die Parsetime zu verbessern?ausser alles rausnehmen .. (products_new im default) und alle boxen (whats_new, specials, etc) die Artikelanzahl hinter den kats. soweit ja, oder hast noch mehr auf Lager :)
Gruss DeeCoo
tust du grad an der suche basteln? (weil die grad nicht geht...)
eigentlich ists doch in der Tabelle specials unnötig zu suchen oder? da sind die artikeln doch auch nur verlinkt mit der products id...
dann wäre nämlich der join mit der tabelle specials überflüssig...!?
ja Tech hehe (danke für dein Interesse)
joa also ich hab die nun total abgespeckt. (siehe unten)
Mir ist aufgefallen das wenn ich einen Begriff suche den es nicht gibt z.b. "reqgrgrthrhwr" dann wird nach einer Parsetime von 2 sekunden ausgegeben, das nichts gefunden wurde. Also relativ schnell, jedenfalls brauch die Seite bei jeden normalen Aufruf immer so um diese Zeit.
Wenn aber Resultate kommen, dauert es halt 10 sekunden.
meine advanced_search_result.php
<?php
/ -----------------------------------------------------------------------------------------
** $Id: advanced_search_result.php 1141 2005-08-10 11:31:36Z novalis $**
** XT-Commerce - community made shopping
** http://www.xt-commerce.com
** Copyright (c) 2005 XT-Commerce
** -----------------------------------------------------------------------------------------
** based on:
** (c) 2000-2001 The Exchange Project**(earlier name of osCommerce)
** (c) 2002-2003 osCommerce(advanced_search_result.php,v 1.68 2003/05/14); www.oscommerce.com
** (c) 2003**** nextcommerce (advanced_search_result.php,v 1.17 2003/08/21); www.nextcommerce.org
** Released under the GNU General Public License
** --------------------------------------------------------------------------------------- /
include ('includes/application_top.php');
// create smarty elements
$smarty = new Smarty;
// include boxes
require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php');
// include needed functions
require_once (DIR_FS_INC.'xtc_parse_search_string.inc.php');
require_once (DIR_FS_INC.'xtc_get_subcategories.inc.php');
require_once (DIR_FS_INC.'xtc_get_currencies_values.inc.php');
/
check search entry
/
$error = 0; // reset error flag to false
$errorno = 0;
$keyerror = 0;
if (isset ($_GET['keywords']) && empty ($_GET['keywords'])) {
****$keyerror = 1;
}
if ((isset ($_GET['keywords']) && empty ($_GET['keywords'])) && (isset ($_GET['pfrom']) && empty ($_GET['pfrom'])) && (isset ($_GET['pto']) && empty ($_GET['pto']))) {
****$errorno += 1;
****$error = 1;
}
elseif (isset ($_GET['keywords']) && empty ($_GET['keywords']) && !(isset ($_GET['pfrom'])) && !(isset ($_GET['pto']))) {
****$errorno += 1;
****$error = 1;
}
if (strlen($_GET['keywords']) < 3 && strlen($_GET['keywords']) > 0 && $error == 0) {
****$errorno += 1;
****$error = 1;
****$keyerror = 1;
}
if (strlen($_GET['keywords']) > 0) {
****if (!xtc_parse_search_string(stripslashes($_GET['keywords']), $search_keywords)) {
********$errorno += 10000000;
********$error = 1;
********$keyerror = 1;
****}
}
if ($error == 1 && $keyerror != 1) {
****xtc_redirect(xtc_href_link(FILENAME_ADVANCED_S EARCH, 'errorno='.$errorno.'&'.xtc_get_all_get_params(array ('x', 'y'))));
} else {
****/
**** ****search process starts here
**** /
****require (DIR_WS_INCLUDES.'header.php');
****//build query
****$select_str = "SELECT distinct
**********************p.products_id,
**********************pd.products_name ";
****$from_str**= "FROM ".TABLE_PRODUCTS." AS p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." AS pd ON (p.products_id = pd.products_id) ";
****$where_str = " WHERE ";
****//go for keywords... this is the main search process
****if (isset ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) {
********if (xtc_parse_search_string(stripslashes($_GET['keywords']), $search_keywords)) {
******************//arrayfix@deecoo
******************$n = sizeof($search_keywords);
******************for( $i = 0; $i < $n; $i++ ) {
************************$where_str .= "pd.products_keywords LIKE ('%".addslashes($search_keywords[$i])."%') ";
************************if (SEARCH_IN_DESC == 'true') {
************************** $where_str .= "OR pd.products_description LIKE ('%".addslashes($search_keywords[$i])."%') ";
************************}************************
************************$where_str .= "OR pd.products_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
************************$where_str .= "OR p.products_model LIKE ('%".addslashes($search_keywords[$i])."%') ";
************************break;
****************}
************}
************$where_str .= " GROUP BY p.products_id ORDER BY p.products_date_added DESC ";
********}
****//glue together
****$listing_sql = $select_str.$from_str.$where_str;
****require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING);
}
$smarty->assign('language', $_SESSION['language']);
$smarty->caching = 0;
if (!defined(RM))
****$smarty->load_filter('output', 'note');
$smarty->display(CURRENT_TEMPLATE.'/index.html');
include ('includes/application_bottom.php');
?>
fiese möpp
04.02.2007, 23:40
echo time()-$time;
''>ZITAT</div>zeigt er immer 1 an[/b]
Schön, bei mir zeigt er 0 an. Ok, Du hast ja auch mehr Daten zu prüfen. :D
Scheint nicht das SQL-Kommando zu sein.
Interessant währe die Gesammtzeit der 'product_listing.php'. Diese wird von der Advanced_search _result einmal aufgerufen. Wenn da über 7 Sekunden kommen, kann man ja weiterschauen, woran es liegt.
Also Anweisungsblock für Anweisungsblock mal die Zeit messen (und hoffen, dass man dann einen Block findet, der viel Zeit verbraucht und besser zu machen ist). :wacko:
vBulletin® v3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.