Вход • Регистрация

Как поиск по сайту сделать правильным?

  • 23 октября 2015 г. , редакция: 23 октября 2015 г.
  • Вот смотрите, что происходит, когда ищем по фразе "Платье 324" (на скрине).

    Выводятся:
    сначала менее подходящее услвиям поиска
    В ближе к конце - более подходящее

    А надо наоборот. Прошу подсказать, как сделать так, чтобы:
    1. Сначала выводилось наиболее подходящее условиям поиска (сейчас выводит тупо по алфавиту).
    2. Как ограничить поиск, допустим, первыми 10-12 символами в названии товара.
    3. Как разрешить искать только в названиях товара в каталоге.
    • 23 октября 2015 г.
    • В приведенном примере есть платье 324, и платье 225 с артикулом материала 324. Вот и путаница получается. Форму записи названий заказчик ни в какую не хочет менять.
  • 23 октября 2015 г.
  • Цитата
    3. Как разрешить искать только в названиях товара в каталоге.

    думаю тут надо править файл shop.search.php
    • 23 октября 2015 г.
    • Благодарю Вас! Там есть:
      Код
      class Shop_search_config
      {
      public $config = array(
      'shop' => array(
      'fields' => array('name', 'param', 'anons', 'text', 'article'),
      'rating' => 6
      ),
      'shop_category' => array(
      'fields' => array('name', 'anons', 'text'),
      'rating' => 6
      ),
      'shop_brand' => array(
      'fields' => array('name', 'text'),
      'rating' => 6
      )
      );
      }

      Попробую сократить до:
      Код
      class Shop_search_config
      {
      public $config = array(
      'shop' => array(
      'fields' => array('name'),
      'rating' => 6
      )
      );
      }


      Должно частично помочь.

      А для чего нужен 'rating' => 6 ?
  • 23 октября 2015 г. , редакция: 23 октября 2015 г.
  • В модельке (модуля поиска по сайту) нашел 3 места, где:
    Код
    $row["name"] = $this->diafan->short_text($row["name"], 20);

    Переделал в:
    Код
    $row["name"] = $this->diafan->short_text($row["name"], 10);
    но все равно ищет во всем названии.

    Код из предыдущего сообщения применил - ничего не изменилось (сайт в режиме разработки, кеш отключен).
  • 23 октября 2015 г. , редакция: 23 октября 2015 г.
  • Забыл сказать, вот тут search.model.php менял порядок сортировки. Тоже без току:
    Код
    $temp_table = false;
    if($this->diafan->configmodules("search_all_word", "search"))
    {
    $order = '';
    // обязательны все слова
    $where = "";
    foreach ($search_words as $k => $key)
    {
    $where .= " INNER JOIN {search_index} AS i".$k." ON r.id=i".$k.".result_id AND i".$k.".keyword_id=".$keys[$key];
    $order .= 'i'.$k.'.rating ASC, ';
    }
    $order .= "r.rating DESC";
    }

    Похоже, что-то надо делать вот с этой строкой:
    Код
    $where .= " INNER JOIN {search_index} AS i".$k." ON r.id=i".$k.".result_id AND i".$k.".keyword_id=".$keys[$key];

    Есть идеи?
  • 25 октября 2015 г.
  • Как вариант. Можно не корректировать, а дополнить. Например, получив результат поиска в виде массива, можно одним проходом перебрать все его записи с последуещем присвоением значения (количество символов в вхождении). А затем ранжировать этот массив согласно этим значениям (максимальное значение в начало, минимальное в конец).
  • 25 октября 2015 г.
  • вот файлы которые за поиск отвечают
    шнклудс/сеарчвордс
    плагинс/стеммер

    там можно как угодно настроить и создание индекса и поисковый алгоритм
  • 27 октября 2015 г.
  • Виталий, Николай! Благодарю за участие.
    Вот что ответили в ТП (делюсь):
    Цитата
    >>1. Сначала выводилось наиболее подходящее условиям поиска (сейчас выводит тупо по алфавиту).

    Предоставьте доступ к сайту по FTP - попробуем выяснить причину.

    >>2. Как ограничить поиск, допустим, первыми 10-12 символами в названии товара.

    Файл modules/search/search.inc.php строка 579:

    заменить
    $index_words = $this->searchwords->prepare($value_for_index);
    на:
    $index_words = $this->searchwords->prepare(utf::substr($value_for_index, 10));

    После внесения изменений нужно переиндексировать. Учтите, что изменения применяться для всех модулей. Если нужно только для товаров, нужно соответсвующие условие прописывать.

    >>3. Как разрешить искать только в названиях товара в каталоге.

    В файле modules/shop/shop.search.php замените:


    'shop' => array(
    'fields' => array('name', 'param', 'anons', 'text', 'article'),
    'rating' => 6
    ),

    на:


    'shop' => array(
    'fields' => array('name'),
    'rating' => 6
    ),

    После этого переиндексируйте модуль.


    Сегодня вечером доберусь до сервера, попробую.
  • 27 октября 2015 г.
  • Сделал как ТП рекомендовал, поиск вообще перестал находить что-либо.
    Подозреваю, что наверно где-то изменился алгоритм за последние 1.5 месяца... А сайт не обновлял с 4 сентября...
  • 27 октября 2015 г.
  • Но нет, поиск работает оказывается, но он начал искать с конца названий товаров! Вот дела!
    Как заставить начать искать с начала названия товара?
    • 27 октября 2015 г. , редакция: 27 октября 2015 г.
    • На мой взгляд у Вас желание связано с изменением механизма поиска. Вы решите эту задачу, но допустим разработчики сделают принципиально новый механизм поиска, который будет работать быстрее и лучше. Тогда Вам придется перерабатывать свое решение. Я бы Вам предлажил не корректировать сам механизм поиска, а работать с его результатом (фильтровать, ранжировать и т.п.). При таком подходе допустим будет задержка в работе скрипта на 0.005 сек. Зато вы спокойно будете обновлять свой сайт
      • 27 октября 2015 г.
      • В общем-то предлагал лишь доработать имеющийся механизм.
        А вот сам сайт не предполагал обновлять.

        ===
        Хорошо, допустим приму во внимание ваше предложение. Вы очень красиво написали, а как это выполнить в коде?
      • 27 октября 2015 г.
      • Ну а вообще, в ближайшей перспективе, планируем интегрировать "живой поиск". Т.е. тут однозначно проблемы при обновлении и к этому надо быть морально готовым. А проще вовсе не обновлять движок.
  • 13 ноября 2015 г.
  • Забыл добавить:
    Код
    Правильный код:

    $index_words = $this->searchwords->prepare(utf::substr($value_for_index, 0, 10));

    иначе искало не в первых 10 символах, а пропуская первые 10 символов.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум