13

Zuerst fand ich ähnliche Fragen in SO, aber es gibt keine Antwort für sie. Der erste Teil der Frage ist also ein wenig dupliziert. Ich möchte die Suchergebnisse in Magento verbessern. Hier ist, was ich bereits getan:Wie und wo kann ich die Magento Suchanfrage ändern?

1. Suche mit AND statt OR, wenn es mehrere Wörter.

2. Die Ajax-Suche beginnt mit der Suche von überall und nicht nur am Anfang der Felder.

3. Schneiden Sie die letzten s aus den Wörtern, um leere Ergebnisse bei der Suche mit Plural zu verhindern.

4. änderte ich den Suchtyp Like-Fulltext oder Combine aber die Ergebnisse waren nicht besser und noch schlimmer waren, also lasse ich es so ist. Es ist Like jetzt, so gibt es keine relevance Bestellung.

Das letzte, was, das ich versuchen will, ist adding this to the search query:

SELECT ... other non-full-text-cols 
MATCH (product_title) AGAINST ('lean body for her') AS rel1, 
MATCH (content) AGAINST ('lean body for her') AS rel2 
FROM table 
WHERE MATCH (product_title,content) AGAINST ('lean body for her') 
ORDER BY (rel1*1.5)+(rel2) 

Hier meine Frage ist, aber ich bin nicht sicher, ob es funktionieren würde, weil ich es nicht testen kann:

$this->_productCollection->addAttributeToSelect(
    array(
    'rel1' => new Zend_Db_Expr('MATCH (name) AGAINST ("'.$queryText.'")'), 
    'rel2' => new Zend_Db_Expr('MATCH (short_description) AGAINST ("'.$queryText.'")') 
    ) 
); 

$this->_productCollection->getSelect() 
    ->where('MATCH (name,short_description) AGAINST ("'.$queryText.'")') 
    ->order('(rel1*1.5)+(rel2)'); 

Die Grundidee besteht darin, ein Bonusgewicht zu einem Ergebnis hinzuzufügen, wenn die Suchanfrage im Titel des Produkts gefunden wird. Das Problem ist, dass ich nicht weiß, wo die Abfrage geändert werden soll. Ich kann nicht finden, wo es ist. $this->_productCollection ist nicht das richtige Objekt, ich weiß es. Ich schaute auf alle Collection.php Dateien, Ressourcenmodelle, Modelle und sogar das Abfrageprotokoll, aber kein Glück. Es gibt nur ein oder zwei Zeilen in einigen Dateien, aber keine vollständige Abfrage. Ich bin neu bei Magento und habe immer noch Probleme damit, diese Art von Sachen zu finden. Also, wo muss ich meine zusätzlichen Sachen platzieren, wenn ich eine Anfrage erweitern muss?

Community Edition Magento, Version 1.6.1.0.

Hinweis: Ich weiß, dass einige Erweiterungen zur Verbesserung der Suchergebnisse viel besser funktionieren als meine Lösungen, aber jetzt muss ich es auf diese Weise machen. Es wäre auch eine gute Erfahrung für mich.

Edit:

Also, ich herausgefunden, wie meine benutzerdefinierten Felder für die Bestellung hinzufügen, aber es ist
untruly denke ich. In class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer ‚s prepareProductCollection Methode habe ich zwei auf die Abfrage verknüpft und erhalten die Felder rel1 und rel2:

$collection->getSelect()->joinLeft(
    array('cpev' => 'catalog_product_entity_varchar'), 
    'cpev.entity_id = e.entity_id AND cpev.attribute_id = 96', 
    array('rel1' => new Zend_Db_Expr('2.01*(LENGTH(cpev.value) - LENGTH(REPLACE(LCASE(cpev.value), LCASE("'.$queryText.'"), "")))/LENGTH("'.$queryText.'")')) 
); 

$collection->getSelect()->joinLeft(
    array('cpet' => 'catalog_product_entity_text'), 
    'cpet.entity_id = e.entity_id AND cpet.attribute_id = 506', 
    array('rel2' => new Zend_Db_Expr('(LENGTH(cpet.value) - LENGTH(REPLACE(LCASE(cpet.value), LCASE("'.$queryText.'"), "")))/LENGTH("'.$queryText.'")')) 
); 

Ich habe diese Felder jetzt aber wie Sie habe ich harte Sachen wie attribute_id = 96 etc., die nicht codiert zu sehen ist gut und es wird nicht immer funktionieren - ich habe diese IDs direkt aus den Datenbanktabellen überprüft. Ich habe es so geschrieben, weil ich keinen Zugriff auf name und short_description Felder habe, aber sie sind im Ergebnis. Ich weiß nicht warum. So ist cpev.valuename Feld und cpet.value ist das short_description Feld. Außerdem kann ich die Ergebnisse nicht nach diesen Feldern sortieren.Ich habe versucht, $collection->addOrder('SUM(rel1+rel2)');, $collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');, einige addAttributeToFilter Sachen usw., aber es funktioniert nicht.

Edit 2: Ich akzeptierte @james "Antwort, aber schließlich kauften wir eine Erweiterung zur Verbesserung der Suchergebnisse.

+0

Mit Solr oder ElasticSearch glaube ich, es ist ein besserer Ansatz für Ihr Problem. Es ist besser geeignet, plural/singuläre Suche, Synonyme, Rechtschreibung, Relevanz abzudecken. – FlorinelChis

+0

Danke, @FlorinelChis. Ich habe auch verschiedene Magento Erweiterungen überprüft. Aber jetzt möchte ich es auf diese Weise tun, weil ich nicht sehr erfahren bin, dass ich Drittanbieter-Sachen hinzufüge, und die zweite Sache ist, dass ich nicht viel Rechte im Webshop habe. Könnten Sie bitte helfen, die ursprüngliche Abfrage zu ändern? – enenen

Antwort

4

In Mage_CatalogSearch_Model_Resource_Fulltext Check-out prepareResult (Linie 310 in 1.7 CE) und suchen Sie nach folgenden Kriterien:

$select->columns(array('relevance' => new Zend_Db_Expr(0))); 

Magento stellt all Suchergebnis Relevanzen als 0 (!); Fügen Sie die gewünschten Relevanzen hinzu (höher ist besser). Sie können eine benutzerdefinierte Abfrage in Zend_Db_Expr() erstellen, um höhere Relevanz bei Attributübereinstimmungen zu generieren.

3

Die Antwort auf Ihre erste Frage (1): ein machen und statt OR suchen, müssen Sie die Klasse

Mage_CatalogSearch_Model_Resource_Fulltext 

Bei dem Verfahren

public function prepareResult($object, $queryText, $query) 

Sie neu schreiben wollen zum Ausschalten des Teil

$likeCond = '(' . join(' OR ', $like) . ')'; 

zu

$likeCond = '(' . join(' AND ', $like) . ')'; 

Stellen Sie sicher, dass Sie den Suchindex anschließend neu indizieren, um einen Effekt zu erzielen.

+0

_Hier ist, was ich schon getan habe: _ war an der Spitze der Liste –

+0

@mpaepper, habe ich schon getan. Mein Problem ist das Ändern der Suchanfrage. – enenen

+0

@enenen Sorry, das habe ich in deiner Frage falsch gelesen. – mpaepper

Verwandte Themen