Поиск по каталогу - исключить названия дочерних продуктов из полного текста
Я некоторое время играл с поиском по каталогу, и я почти закончил, но со мной происходит одна странная вещь. Единственными атрибутами ", которые можно использовать в поиске", являются 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');
Пока все работает нормально, за исключением того, что каким-то образом он также индексирует название соответствующего продукта в полнотекстовой таблице, что в конечном итоге затрудняет мой поиск, потому что дает предвзятые результаты.
Есть ли у кого-нибудь идеи о том, как изменить это поведение или контролировать его с помощью администратора?
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
, чтобы было похоже, что есть никаких детских товаров для любого другого продукта.
таким образом, дочерние продукты не будут индексироваться в данных родительского продукта.
Вы уже можете установить синонимы в бэк-офисе с помощью "поисковый запрос" в меню каталога. Для этого поисковый запрос, который уже использовался во фронт-офисе, а затем вы можете перенаправить на страницу продукта, категории или cms, которая вам нравится. Для продуктов вы можете настроить видимость в соответствии с тем, что вы хотите отобразить в результатах поиска, поэтому вам действительно не нужно беспокоиться о child_skus.
Я бы посоветовал вам установить elasticsearch или solr с соответствующим модулем, чтобы действительно улучшите результаты поиска. Более того, вы действительно можете лучше справляться с нечеткими запросами, дикими картами и так далее.