Magento Forum

   
Fehler bei Suche nach mehr als einem Attribut
 
Kre8
Jr. Member
 
Total Posts:  15
Joined:  2008-04-18
 

Hallo,

ich habe 4 Attribute als Typ Preis festgelegt, da nur dieser Typ mit “Von-Bis” gesucht werden kann und keine Vorgaben braucht (wie ein Dropdown z.B.)
Nach diesen 4 Attributen soll nun gesucht werden, wenn man nach einem sucht z.B. Höhe von 90-120 findet er auch die richtigen Produkte, wenn man jetzt allerdings noch zusätzlich nach der Länge sucht findet er kein Produkt mehr.

Ist das ein Bug oder funktioniert das Suchen nach mehreren “Preisattributen” einfach nciht, wenn nicht wieso nicht, oder wie kann man es umbauen?
Wo und wie kann ich mir den SQL-String der Suche ausgeben lassen in welcher Datei? (zu Debug-zwecken)

Freue mich auf Antworten

Grüße
Kre8

 
Magento Community Magento Community
Magento Community
Magento Community
 
mzentrale1
Guru
 
Total Posts:  731
Joined:  2007-12-06
Stuttgart, Germany
 

Hi,

wir haben das selbe problem. z.B. produkt mit dem namen “modische kurzarmbluse”. wird dieser begriff gesucht, gleicher wortlaut, dann wird das entsprechende ergebnis gefunden. suche ich jedoch nach “modische bluse” wird kein ergebnis gefunden. bin gerade dabei
die suche zu analysieren. wenn ich genaueres weiss gebe ich bescheid.

grüsse

stefan

 
Magento Community Magento Community
Magento Community
Magento Community
 
mzentrale1
Guru
 
Total Posts:  731
Joined:  2007-12-06
Stuttgart, Germany
 

Hi,

wer suchet der findet smile.

In der Klasse Mage_CatalogSearch_Model_Mysql4_Search_Collection (core/Mage/CatalogSearch/Model/Mysql4/Search/Collection.php) findet sich eine Methode addSearchFilter() die den Suchstring empfängt:

Original:

public function addSearchFilter($query)
    
{
        $this
->_searchQuery '%'.$query.'%';
        
$this->addFieldToFilter('entity_id', array('in'=>new Zend_Db_Expr($this->_getSearchEntityIdsSql($query))));
        return 
$this;
    
}

Ich habe diese Testweise im Core umgeschrieben zu folgender Funktion (nur testweise, müsste noch optimiert werden). Wenn ein Leerzeichen im Suchterm gefunden wird dann wird nach beiden Teilstrings gesucht.

public function addSearchFilter($query)
    
{
        $queryParts 
explode(' ',$query);
        if(
is_array($queryParts) && count($queryParts) > 0){
            
foreach($queryParts AS $key => $val){
                $this
->_searchQuery '%'.$val.'%';
                
$this->addFieldToFilter('entity_id', array('in'=>new Zend_Db_Expr($this->_getSearchEntityIdsSql($val))));
            
}
        }else{
            $this
->_searchQuery '%'.$query.'%';
            
$this->addFieldToFilter('entity_id', array('in'=>new Zend_Db_Expr($this->_getSearchEntityIdsSql($query))));
        
}
        
        
#$this->_searchQuery = '%'.$query.'%';
        #$this->addFieldToFilter('entity_id', array('in'=>new Zend_Db_Expr($this->_getSearchEntityIdsSql($query))));
        
return $this;
    
}

Nun werden auch Teilstrings in den Produktnamen oder Beschreibungen gefunden.

Nun könnte man ein Modul aufsetzten und in diesem Modul diese Funktion des Models anpassen und somit upgradefähig halten. Natürlich muss vor einem Upgrade die Funtkionalität getestet werden.

Grüsse

Stefan

 
Magento Community Magento Community
Magento Community
Magento Community
 
Kre8
Jr. Member
 
Total Posts:  15
Joined:  2008-04-18
 

Mein Problem ist schon etwas anders, wahrscheinlich dadurch das meine Attribute als Preise deklariert sind, die von dir angesprochene Datei wird bei mir erst garnicht verwendet.

So ich habe jetzt mal aus dem Hauptarray den SQL String bekommen, der auch garnicht funktionieren kann. Meine Frage ist, wo wird dieser generiert? In such mir hier einen ab aber finde die stelle nicht :(

Naja hier der innere SQL-String der die Suchabfrage steuert.

SELECT `catalogindex_price`.`entity_id
FROM `catalogindex_price
WHERE (
        (
attribute_id '49') AND 
        (
value >= '1') AND 
        (
value <= '10') AND 
        (
store_id '1')
    ) OR (
        (
attribute_id '576') AND 
        (
value >= '700') AND 
        (
value <= '1500') AND 
        (
store_id '1')
    )

Das ganze kann natürlich nicht funktionieren da ein Datensatz niemals 2 attribut_ids haben kann, etc. Naja das ganze so umzubauen das es passt mit Abfragen etc. wäre ja kein Problem, nur wo wird diese SQL Abfrage erstellt?

**EDIT**
Oder wo wird das [_select] Array oder besser noch das [where] Array erstellt?
**EDIT**

Kre8

 
Magento Community Magento Community
Magento Community
Magento Community
 
Kre8
Jr. Member
 
Total Posts:  15
Joined:  2008-04-18
 

Okay, also das where Array wird hier erstellt: “magento/Zend/Db/Select.php”

Das Problem ist jetzt nurnoch wo die function where aufgerufen wird für die Suche? In der Datei “magento/app/code/core/Mage/CatalogSearch/Model/Mysql4/Advanced/Collection.php ist es nämlich nicht, was ich nicht wirklich nachvollziehen kann, wofür ist die Datei dann überhaupt da??

Kre8

 
Magento Community Magento Community
Magento Community
Magento Community
 
mzentrale1
Guru
 
Total Posts:  731
Joined:  2007-12-06
Stuttgart, Germany
 

Hi,

hier in diesem snippet aus der Collection.php wird die Funktion oft aufgerufen:

if (!is_numeric($attributeId)) {
                        
foreach ($conditionData as $data{
                            
if (is_array($data)) {
                                $select
->where('t1.'.$attributeId ' ' $data[0]$data[1]);
                            
}
                            
else {
                                $select
->where('t1.'.$attributeId ' ' $data);
                            
}
                        }
                    }
                    
else {
                        $storeId 
$this->getStoreId();
                        
$select->joinLeft(
                            array(
't2' => $table),
                            
$this->getConnection()->quoteInto('t1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id=?'$storeId),
                            array()
                        );
                        
$select->where('t1.store_id = ?'0);
                        
$select->where('t1.attribute_id = ?'$attributeId);

                        foreach (
$conditionData as $data{
                            
if (is_array($data)) {
                                $select
->where('IFNULL(t2.value, t1.value) ' $data[0]$data[1]);
                            
}
                            
else {
                                $select
->where('IFNULL(t2.value, t1.value) ' $data);
                            
}
                        }
                    }

                    
if (!is_null($previousSelect)) {
                        $select
->where('t1.entity_id IN(?)', new Zend_Db_Expr($previousSelect));
                    
}

Grüsse

 
Magento Community Magento Community
Magento Community
Magento Community
 
Kre8
Jr. Member
 
Total Posts:  15
Joined:  2008-04-18
 

Hallo [m] Zentrale, in der besagten Datei wird die Funktion oft aufgerufen ja, es gibt aber rund 130 Aufrufe dieser Funktion in dem Shop…

Deine Hilfe ist ja sicherlich nett gemeint, aber das du mir Quelltext einer Datei schreibst die diese Funktion mehrfach aufruft bringt mir 0.

Selbst wenn ich allen Inhalt aus den Klassen die im Ordner “...\core\Mage\CatalogSearch\Model\Mysql4” sind lösche, bekomm ich keine Fehler und die Suche funktioniert.

Wo wird jetzt also die $select->where ausgeführt welche für die Erweiterte Suche zuständig ist wenn nicht im Mysql4 Ordner der CatalogSearch? So langsam fang ich an, an magento zu zweifeln. Vorallem da dieser Fehler einfach nur ein Bug des Shops ist.

Kre8

 
Magento Community Magento Community
Magento Community
Magento Community
 
mzentrale1
Guru
 
Total Posts:  731
Joined:  2007-12-06
Stuttgart, Germany
 

Hi,

das kann aber nicht sein das du die dateien aus dem ordner löschst und die suche noch funktioniert. Echt? Handelt es sich um die erweiterte oder die standardsuche die du optimieren willst. Und übrigens hast du gefragt wo diese funktion in der Datei aufgerufen wird und ich habe dir einen Snippet eben aus dieser Datei gepostet.

Grüsse

 
Magento Community Magento Community
Magento Community
Magento Community
 
Kre8
Jr. Member
 
Total Posts:  15
Joined:  2008-04-18
 
zentrale - 16 May 2008 04:15 AM

Hi,
das kann aber nicht sein das du die dateien aus dem ordner löschst und die suche noch funktioniert. Echt?

Ich lösche nicht die Dateien, ich lösche lediglich alles aus den Klassen, was heißt es werden nur Funktionen der vererbten Klassen verwendet bei der Suche, wenn überhaupt.

zentrale - 16 May 2008 04:15 AM

Handelt es sich um die erweiterte oder die standardsuche die du optimieren willst.


Die Erweiterte Suche.
zentrale - 16 May 2008 04:15 AM

Und übrigens hast du gefragt wo diese funktion in der Datei aufgerufen wird und ich habe dir einen Snippet eben aus dieser Datei gepostet.
Grüsse

Nein ich habe gefragt wo die Funktion für die Suche aufgerufen wird, die Funktion wird rund 1300 mal in dem Projekt aufgerufen. Und leider sind die Funktionsaufrufe in dem Snippet auch nicht die, die dafür zuständig sind :(

Sorry das ich so direkt bin, aber bin ziemlich angefressen weil ich dachte das dieses ewige rumgesuche mit dem Wechsel vom XTC zu Magento endlich vorbei ist, aber eher das Gegenteil zutrifft. Trotzdem danke.

Kre8

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
    Back to top