Поиск по каталогу - исключить названия дочерних продуктов из полного текста


Я некоторое время играл с поиском по каталогу, и я почти закончил, но со мной происходит одна странная вещь. Единственными атрибутами ", которые можно использовать в поиске", являются name, child_skus и synonyme. В child_skus я сохраняю артикулы связанных продуктов моих сгруппированных продуктов, так как я работаю с сгруппированными продуктами только на интерфейсе. synonyme содержит список слов, разделенных комой, которые относятся к указанному продукту.

Что я использую для полнотекстового поиска является следующим кодом:

$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');  

Пока все работает нормально, за исключением того, что каким-то образом он также индексирует название соответствующего продукта в полнотекстовой таблице, что в конечном итоге затрудняет мой поиск, потому что дает предвзятые результаты.

Есть ли у кого-нибудь идеи о том, как изменить это поведение или контролировать его с помощью администратора?

Author: Julien Lachal, 2014-09-25

2 answers

Взгляните на метод Mage_CatalogSearch_Model_Resource_Fulltext::_rebuildStoreIndex. Это тот, который фактически перестраивает индекс полнотекстового поиска.
Где-то внутри него вы найдете это:

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

И позже

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

Это означает, что для настраиваемых, сгруппированных и упакованных продуктов атрибуты дочерних продуктов также индексируются.
Вы можете переписать модель и удалить эти части или оставить ее такой, какая она есть, и просто переписать метод _getProductChildIds в том же классе и заставить его вернуть null, чтобы было похоже, что есть никаких детских товаров для любого другого продукта.
таким образом, дочерние продукты не будут индексироваться в данных родительского продукта.

 3
Author: Marius, 2014-09-25 08:09:04

Вы уже можете установить синонимы в бэк-офисе с помощью "поисковый запрос" в меню каталога. Для этого поисковый запрос, который уже использовался во фронт-офисе, а затем вы можете перенаправить на страницу продукта, категории или cms, которая вам нравится. Для продуктов вы можете настроить видимость в соответствии с тем, что вы хотите отобразить в результатах поиска, поэтому вам действительно не нужно беспокоиться о child_skus.

Я бы посоветовал вам установить elasticsearch или solr с соответствующим модулем, чтобы действительно улучшите результаты поиска. Более того, вы действительно можете лучше справляться с нечеткими запросами, дикими картами и так далее.

 1
Author: Christophe Ferreboeuf, 2014-09-25 07:58:12