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