Подтвердить что ты не робот

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

4b9b3361

Ответ 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) . ')';

Обязательно повторно проиндексируйте индекс поиска, чтобы получить эффект.