1 Отредактировано Ярослав (16.08.2018 13:28:36)

Тема: Подсистема поиска. Оптимизация, улучшение

Здравствуйте, коллеги!
Особо на поиск не обращал внимание, но тут у клиентов появились новые менеджеры, которые засыпали меня заявками.
Суть в том, что при наборе в поисковой строке слова "Ручка" во всплывающей подсказке выводятся первыми не товары с данным словом в начале, а просто товары, содержащие данное слово в названии. У покупателя может сложится ложное впечатление, что товаров "Ручка" в ассортименте нет (хотя их несколько тысяч)
Интересно, что вывод товаров на странице поиска отличается от вывода во всплывающем окне.
Я перепробовал все типы поиска, но все равно свое основное предназначение - поиск наиболее подходящего товара, ни один не выполнил.
Может быть. кто то использовать сторонние сервисы поиска или делал оптимизацию?

Вот пример с демо сайта. Ищу платья, выходят босоножки.
https://yadi.sk/i/Iql5BPsr3aHDZi

2 Отредактировано Ярослав (19.03.2019 18:55:23)

Re: Подсистема поиска. Оптимизация, улучшение

Разобрался я в причине того, что результаты поиска в блоке поиска отличаются от страницы поиска)
Я думал, что поиск в блоке поиска делается механизмами модуля Search, но получается, что там свой код и категории ищутся вне зависимости от настроек модуля Search просто по %like%.

Я немного скорректировал searchlineapi.inc.php в блоке поиска. Теперь поиск в категориях идет в следующем порядке: like%, транслитерация like%, %like%, транслитерация %like%. Если на этапе есть вхождение, то далее поиск не идет. Слава богу, "мел" теперь найти можно))
https://yadi.sk/d/geI1drZ9g7ZIJg

И до кучи в контроллере блока searchline поменял порядок вывода: Категория->Товар->Бренд.
В принципе, клиент доволен, я тоже) Получается, что претензии были не к модулю поиска товаров, а к реализации поиска у блока строки поиска.

https://yadi.sk/d/rIjrrrzoKe3IqQ

Re: Подсистема поиска. Оптимизация, улучшение

Ярослав, а как посмотреть в действии Вашу доработку? Как ее подключить на сайте?

4

Re: Подсистема поиска. Оптимизация, улучшение

Алексей, ведь Ярослав скинул файл. Положите его рядом с оригинальным файлом
/modules/search/model/searchapi.inc.php
и всё

Re: Подсистема поиска. Оптимизация, улучшение

положил, но не особо разницу увидел. По трем символам не ищет вовсе. и вообще в выдаче много мусора как выдавало, так и выдает. В настройках какой должен быть поиск по умолчанию?

6 Отредактировано Ярослав (18.03.2019 13:33:51)

Re: Подсистема поиска. Оптимизация, улучшение

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

То есть решил задачу только для вывода категорий, вывод товаров надо настраивать в модуле поиска.

Re: Подсистема поиска. Оптимизация, улучшение

Ярослав пишет:

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

На всякий случай сбросил. Но без изменений.

Re: Подсистема поиска. Оптимизация, улучшение

Ярослав пишет:

Разобрался я в причине того, что результаты поиска в блоке поиска отличаются от страницы поиска)
Я думал, что поиск в блоке поиска делается механизмами модуля Search, но получается, что там свой код и категории ищутся вне зависимости от настроек модуля Search просто по %like%.

Я немного скорректировал searchlineapi.inc.php в блоке поиска. Теперь поиск в категориях идет в следующем порядке: like%, транслитерация like%, %like%, транслитерация %like%. Если на этапе есть вхождение, то далее поиск не идет. Слава богу, "мел" теперь найти можно))
https://yadi.sk/d/geI1drZ9g7ZIJg

И до кучи в контроллере блока searchline поменял порядок вывода: Категория->Товар->Бренд.
В принципе, клиент доволен, я тоже) Получается, что претензии были не к модулю поиска товаров, а к реализации поиска у блока строки поиска.

Напишите пожелания в наш сервис пожеланий.

Re: Подсистема поиска. Оптимизация, улучшение

Хорошо, Александр, создам.

И до кучи в контроллере блока searchline поменял порядок вывода: Категория->Товар->Бренд.

Забыл модифицированный контроллер блока выложить https://yadi.sk/d/rIjrrrzoKe3IqQ
из catalog/controller/block

10

Re: Подсистема поиска. Оптимизация, улучшение

Ярослав пишет:

Хорошо, Александр, создам.
Забыл модифицированный контроллер блока выложить из catalog/controller/block

О! А вот так вроде другие результаты стали. Более релевантные. Еще потестирую.

11

Re: Подсистема поиска. Оптимизация, улучшение

https://helpdesk.readyscript.ru/wish/Mo … a-684.html
Добавил пожелание

12

Re: Подсистема поиска. Оптимизация, улучшение

1. почему после транслитерации запроса пропал setFilter('public', 1) ?
2. чем setFilter('name', "$query%", 'like') от setFilter('name', $query, '%like%') отличается? почему такой синтаксис?
3. удаление методов getSearchQueryProductResults, getSearchQueryProductCount ломает обратную совместимость и может привести к проблемам в сторонних модулях.

У меня получился вот такой вариант:

public function getSearchQueryCategoryResults($query, $limit = 1)
{
    $list = $this->dirapi
                 ->setFilter('name', $query, 'like%')
                 ->setFilter('public', 1)
                 ->getList(1, $limit);
    $limit -= count($list);
    
    if ($limit) {
        $list2 = $this->dirapi
                      ->clearFilter()
                      ->setFilter('id', $this->getIds($list), 'notin')
                      ->setFilter('name', $query, '%like%')
                      ->setFilter('public', 1)
                      ->getList(1, $limit);
        $list = array_merge($list, $list2);
        $limit -= count($list2);
    }
    
    // Если не нашли результаты, то посмотрим с транслитом
    if ($limit) {
        $query = Transliteration::puntoSwitchWord($query);
        $list2 = $this->dirapi
                      ->clearFilter()
                      ->setFilter('id', $this->getIds($list), 'notin')
                      ->setFilter('name', $query, 'like%')
                      ->setFilter('public', 1)
                      ->getList(1, $limit);
        $list = array_merge($list, $list2);
        $limit -= count($list2);
        
        if ($limit) {
            $list2 = $this->dirapi
                          ->clearFilter()
                          ->setFilter('id', $this->getIds($list), 'notin')
                          ->setFilter('name', $query, '%like%')
                          ->setFilter('public', 1)
                          ->getList(1, $limit);
            $list = array_merge($list, $list2);
        }
    }
    return $list;
}

Повысить оценку Понизить оценку

13 Отредактировано Ярослав (23.03.2019 02:37:27)

Re: Подсистема поиска. Оптимизация, улучшение

1. почему после транслитерации запроса пропал setFilter('public', 1) ?
2. чем setFilter('name', "$query%", 'like') от setFilter('name', $query, '%like%') отличается? почему такой синтаксис?
3. удаление методов getSearchQueryProductResults, getSearchQueryProductCount ломает обратную совместимость и может привести к проблемам в сторонних модулях.

1. В исходном коде этого не было
2. В исходном коде был первый вариант, я использовал второй.
3. Методов не хватает, так как делалось для старой версии 3, там их нет.

14

Re: Подсистема поиска. Оптимизация, улучшение

 /**
     * Возвращает результаты поиска по категориям в зависимости от запроса
     *
     * @param string $query - строка для поиска
     * @param integer $limit - лимит результатов поиска
     *
     * @return \Catalog\Model\Orm\Dir[]
     */
    function getSearchQueryCategoryResults($query, $limit = 1)
    {
        $list = $this->dirapi->setFilter('name', "%$query%",'like')
            ->getList(1, $limit);

        //Если не нашли результаты, то посмотрим странслитом
        if (empty($list)){
            $query = \RS\Helper\Transliteration::puntoSwitchWord($query);
            $list = $this->dirapi->clearFilter()->setFilter('name', "%$query%",'like')
                ->getList(1, $limit);
        }
        return $list;
    }

Вот код исходного модуля. О public речи нет.

15

Re: Подсистема поиска. Оптимизация, улучшение

    /**
     * Возвращает результаты поиска по категориям в зависимости от запроса
     *
     * @param string $query - строка для поиска
     * @param integer $limit - лимит результатов поиска
     *
     * @return \Catalog\Model\Orm\Dir[]
     */
    function getSearchQueryCategoryResults($query, $limit = 1)
    {
        $list = $this->dirapi
                        ->setFilter('name', $query, '%like%')
                        ->setFilter('public', 1)
                        ->getList(1, $limit);

        //Если не нашли результаты, то посмотрим странслитом
        if (empty($list)){
            $query = Transliteration::puntoSwitchWord($query);
            $list = $this->dirapi->clearFilter()->setFilter('name', "%$query%",'like')
                ->getList(1, $limit);
        }
        return $list;
    }

В версии на текущую дату public есть, но нет его в транслитерации. Забыли видимо

16

Re: Подсистема поиска. Оптимизация, улучшение

Ярослав пишет:

В версии на текущую дату public есть, но нет его в транслитерации. Забыли видимо

о каком public'е Вы все пишите?

Ярослав пишет:

1. В исходном коде этого не было

качественно перенесли старые баги!

Ярослав пишет:

3. Методов не хватает, так как делалось для старой версии 3, там их нет.

Вы бы хоть написали об этом, а то кто-то на радостях скачает и радости не ощутит smile

Повысить оценку −3 Понизить оценку

17 Отредактировано Ярослав (23.03.2019 04:26:46)

Re: Подсистема поиска. Оптимизация, улучшение

о каком public'е Вы все пишите?

качественно перенесли старые баги!

Вы бы хоть написали об этом, а то кто-то на радостях скачает и радости не ощутит smile

Мне уже начинает надоедать ваша манера общения. Кто хочет, тот применит, если надо исправит. Какой public понятно из пункта 1 вашего же вопроса.