Question

Je joue avec la recherche de catalogue depuis un moment et j'ai presque terminé, mais il m'arrive une chose étrange.Le seul "utilisable dans la recherche" les attributs sont name, child_skus et synonyme.Dans child_skus, je stocke les skus des produits associés à mes produits groupés, car je travaille avec des produits groupés uniquement sur le frontend. synonyme contient une liste de mots séparés par des virgules et liés audit produit.

Ce que j'utilise pour la recherche en texte intégral est le code suivant :

$query = Mage::getModel('catalogsearch/query')->setQueryText($searchText)->prepare();
$fulltextResource = Mage::getResourceModel('catalogsearch/fulltext')->prepareResult(
            Mage::getModel('catalogsearch/fulltext'), 
            $searchText, 
            $query
        );
$products->getSelect()->joinInner(
            array('search_result' => $products->getTable('catalogsearch/result')),
            $products->getConnection()->quoteInto(
                'search_result.product_id=e.entity_id AND search_result.query_id=?',
                $query->getId()
            ),
            array('relevance' => 'relevance')
        );
$products->getSelect()->order('relevance DESC');  

Tout fonctionne bien pour l'instant, sauf que d'une manière ou d'une autre, il indexe également le nom du produit associé dans la table de texte intégral, ce qui finit par bloquer ma recherche car cela donne des résultats biaisés.

Quelqu'un a-t-il une idée sur la façon de modifier ce comportement ou de le contrôler via l'administrateur ?

Était-ce utile?

La solution

Jetez un oeil à la méthode Mage_CatalogSearch_Model_Resource_Fulltext::_rebuildStoreIndex.C'est celui qui reconstruit l'index de recherche Fultext.
Quelque part à l'intérieur, vous trouverez ceci :

$productChildren = $this->_getProductChildIds($productData['entity_id'], $productData['type_id']);
$productRelations[$productData['entity_id']] = $productChildren;

et ensuite

if ($productChildren = $productRelations[$productData['entity_id']]) {
   foreach ($productChildren as $productChildId) {
       if (isset($productAttributes[$productChildId])) {
           $productIndex[$productChildId] = $productAttributes[$productChildId];
       }
   }
}

Cela signifie que pour les produits configurables, groupés et groupés, les attributs du produit enfant sont également indexés.
Vous pouvez réécrire le modèle et supprimer ces parties, ou le laisser tel quel et simplement réécrire la méthode. _getProductChildIds dans la même classe et le faire revenir null ce sera donc comme s'il n'y avait pas de produits pour enfants pour aucun autre produit.
de cette façon, les produits enfants ne seront pas indexés dans les données du produit parent.

Autres conseils

Vous pouvez déjà définir les synonymes dans le back-office avec "terme de recherche" dans le menu catalogue.Pour ce faire, le terme de recherche doit avoir déjà été utilisé en front-office et vous pouvez ensuite rediriger vers la page produit, catégorie ou cms que vous aimez.Pour les produits, vous pouvez définir la visibilité en fonction de ce que vous souhaitez afficher dans les résultats de recherche afin de ne pas vraiment avoir à vous soucier du child_skus.

Je vous suggère d'installer elasticsearch ou solr avec un module approprié pour réellement améliorer les résultats de recherche.De plus, vous pouvez vraiment mieux gérer les requêtes floues, les jokers, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top