Как и где можно изменить поисковый запрос Magento?
Прежде всего, я нашел похожие вопросы в SO, но ответа на них нет. Итак, первая часть вопроса немного дублируется. Я хочу улучшить результаты поиска в Magento. Вот что я уже сделал:
1. Поиск с AND
вместо OR
при наличии нескольких слов.
2. Поиск Ajax начинает поиск из любого места, а не только с начала полей.
3. Обрезать последний s
со слов, чтобы предотвратить пустые результаты при поиске с помощью множественных чисел.
4. Я изменил тип поиска с Like
на Fulltext
или Combine
, но результаты были не лучше и даже хуже, поэтому я оставляю его как есть. Теперь он Like
, поэтому упорядочения relevance
нет.
Последнее, что я хочу попробовать, это добавить это в поисковый запрос:
SELECT ... other non-full-text-cols
MATCH (product_title) AGAINST ('lean body for her') AS rel1,
MATCH (content) AGAINST ('lean body for her') AS rel2
FROM table
WHERE MATCH (product_title,content) AGAINST ('lean body for her')
ORDER BY (rel1*1.5)+(rel2)
Вот мой запрос, но я не уверен, что это сработает, потому что я не могу его протестировать:
$this->_productCollection->addAttributeToSelect(
array(
'rel1' => new Zend_Db_Expr('MATCH (name) AGAINST ("'.$queryText.'")'),
'rel2' => new Zend_Db_Expr('MATCH (short_description) AGAINST ("'.$queryText.'")')
)
);
$this->_productCollection->getSelect()
->where('MATCH (name,short_description) AGAINST ("'.$queryText.'")')
->order('(rel1*1.5)+(rel2)');
Основная идея - добавить бонусный вес к результату, если поисковый запрос найден в названии продукта. Проблема в том, что я не знаю, где изменить запрос. Я не могу найти, где это вообще. $this->_productCollection
не является правильным объектом, я это знаю. Я просмотрел все файлы Collection.php
, модели ресурсов, модели и даже журнал запросов, но не повезло. В некоторых файлах всего несколько или несколько строк, но не полный запрос. Я новичок в Magento и все еще испытываю проблемы с поиском этого типа вещей. Итак, где я должен разместить свои дополнительные материалы, когда мне нужно расширить запрос?
Community Edition Magento, версия 1.6.1.0.
Примечание. Я знаю, что некоторое расширение для улучшения результатов поиска будет работать намного лучше, чем мои решения, но сейчас я должен сделать это таким образом. Это было бы хорошим опытом для меня.
Edit:
Итак, я понял, как добавить свои пользовательские поля для заказа, но это
Неверный, я думаю. В методе class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer
prepareProductCollection
я добавил два запроса к запросу и получил поля rel1
и rel2
:
$collection->getSelect()->joinLeft(
array('cpev' => 'catalog_product_entity_varchar'),
'cpev.entity_id = e.entity_id AND cpev.attribute_id = 96',
array('rel1' => new Zend_Db_Expr('2.01*(LENGTH(cpev.value) - LENGTH(REPLACE(LCASE(cpev.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);
$collection->getSelect()->joinLeft(
array('cpet' => 'catalog_product_entity_text'),
'cpet.entity_id = e.entity_id AND cpet.attribute_id = 506',
array('rel2' => new Zend_Db_Expr('(LENGTH(cpet.value) - LENGTH(REPLACE(LCASE(cpet.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);
У меня есть эти поля сейчас, но, как вы можете видеть, у меня есть жестко закодированные вещи, такие как attribute_id = 96
и т.д., что совсем не хорошо, и он не будет работать каждый раз - я проверял эти идентификаторы непосредственно из таблиц базы данных. Я написал это так, потому что у меня нет доступа к полям name
и short_description
, но они находятся в результате. Не знаю, почему. Итак, cpev.value
- это поле name
, а cpet.value
- поле short_description
. Более того, я не могу упорядочить результаты по этим полям. Я пробовал $collection->addOrder('SUM(rel1+rel2)');
, $collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');
, некоторые вещи addAttributeToFilter
и т.д., Но он не работает.
Изменить 2:
Я принял ответ @james, но, наконец, мы купили расширение для улучшения результатов поиска.
Ответы
Ответ 1
В Mage_CatalogSearch_Model_Resource_Fulltext
проверьте prepareResult
(строка 310 в 1.7 CE) и найдите следующее:
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
Magento устанавливает все релевантности результатов поиска как 0 (!); добавьте нужную вам информацию (выше, лучше). Вы можете создать пользовательский запрос в Zend_Db_Expr()
, чтобы генерировать более высокие значения совпадений атрибутов.
Ответ 2
Ответ на ваш первый вопрос (1):
Чтобы выполнить поиск AND вместо OR, вам нужно будет переписать класс
Mage_CatalogSearch_Model_Resource_Fulltext
В методе
public function prepareResult($object, $queryText, $query)
вы хотите переключить часть
$likeCond = '(' . join(' OR ', $like) . ')';
to
$likeCond = '(' . join(' AND ', $like) . ')';
Обязательно повторно проиндексируйте индекс поиска, чтобы получить эффект.