Tuesday, October 8, 2013

Улучшение поиска Magento CE

Как вы, наверное, знаете, быстрый поиск по-умолчанию в Magento - полное говно. В интернете есть множество вариантов решения данной проблемы, но, если честно, среди них большинство оптимизированы под конкретные нужды, а некоторые предложения просто мгновенно повышают у читателя уровень фейспалма в организме.

Я предложу проверенный и мега простой хак, в результате которого ваш быстрый поиск превратится в машину ПКДИТЧН (Поиск-Который-Действительно-Ищет-То-Что-Нужно)!

 Часто встречал мнение, что только Fulltext тип поиска может обеспечить релевантные результаты без воды, но я с этим категорически не согласен. Функционал Fulltext'a при желании можно заменить автозаполнением на Ajax. Но, так как мы хотим поиск, который может  предложить товар посетителю, а не просто выполнить точное указание, то мы пойдем другим путём. Через Like.

Итак, перечень простых действий:


1. В админке идем Catalog -> Attributes -> Manage Attributes. Сортируем атрибуты "Для поиска" или Searchable и меняем это значение на Нет в тех атрибутах, которые нам не нужны. Если вы еще не создавали своих атрибутов, то можно оставить Да только в атрибутах Name и SKU. По идее, этого будет достаточно. Если у вас такой магазин, что ключевая информация о товаре идет в описании, то описание оставляем тоже. Думаю, сможете с этим разобраться.

Это действие уменьшит "воду" в результатах поиска. 

2.  Идем System -> Configuration -> Catalog/Catalog -> Catalog Search и устанавливаем значения как на картинке. Конечно, это не догма, но я бы посоветовал примерно так:





3. Самое сложное :) Добираемся до ../app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php (Если вы уже сделали копию Core в Local, то, соответственно идем в локал. Если вы не делали этого, то обязательно сделайте.)
Приблизительно в районе 330 строчки находим
foreach ($words as $word) {
                    $like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
                }
                if ($like) {
                    $likeCond = '(' . join(' OR ', $like) . ')';
                }
Я выделил нужную строку. В этой строке нужно заменить OR на AND.

4.  Идем ../app/design/frontend/default/ваш_шаблон/template/catalogsearch/form.mini.php
Если файла там нет - ищем в ../app/design/frontend/base/default/template/catalogsearch/form.mini.php и копируем куда положено.
После строки
<form id="search_mini_form" action=" <?php echo $this-> helper ('catalogsearch') -> getResultUrl() ?>" method="get">
Вставляем
<input type="hidden" name="order" value="relevance">
<input type="hidden" name="dir" value="desc">   
Это необходимо для сортировки результатов поиска по релевантности.

5. Вроде бы последнее.
Возвращаемся в админку. Catalog-> Search Terms. Удаляем всё.
Затем делаем реиндекс и чистим кеш.


Ну что, посмотрим, что получилось?
Обратите внимание на порядок слов в поисковом запросе. 

Еще пример:
А Fulltext в обоих случаях не выдал бы ни одного результата.


На этом всё. Надеюсь я нигде ничего не забыл и не перепустал и кому-то эта инструкция поможет.



2 comments:

  1. спасибо, всё работает на magento 1.8

    ReplyDelete
  2. Спасибо камрад, метод работает на Magento CE 1.9.1.0

    ReplyDelete