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

magento.stackexchange https://magento.stackexchange.com//questions/37032

Вопрос

Я некоторое время играл с catalogsearch, и я почти закончил, но со мной происходит одна странная вещь.Единственный "пригоден для использования в поиске" атрибуты - это name, child_skus и synonymechild_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');  

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

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

Это было полезно?

Решение

Взгляните на этот метод 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 таким образом, это будет похоже на то, что нет дочерних продуктов ни для какого другого продукта.
таким образом, дочерние продукты не будут проиндексированы в данных родительского продукта.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top