Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Форум Модули DIAFAN.CMS Поиск по сайту Как поиск по сайту сделать правильным?


Валерий Викторович (Sherrlok) 14423 октября 2015 г., редакция 23 октября 2015 г.

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

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

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

Валерий Викторович (Sherrlok) 14423 октября 2015 г.

В приведенном примере есть платье 324, и платье 225 с артикулом материала 324. Вот и путаница получается. Форму записи названий заказчик ни в какую не хочет менять.

Dmitry (weissfl) 12523 октября 2015 г.

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

думаю тут надо править файл shop.search.php

Валерий Викторович (Sherrlok) 14423 октября 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 ?

Валерий Викторович (Sherrlok) 14423 октября 2015 г., редакция 23 октября 2015 г.

В модельке (модуля поиска по сайту) нашел 3 места, где:
Код
$row["name"] = $this->diafan->short_text($row["name"], 20);

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

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

Валерий Викторович (Sherrlok) 14423 октября 2015 г.

Переиндексировал поиск. Опять то же самое как на скрине выше. Тфу! Зараза...

Валерий Викторович (Sherrlok) 14423 октября 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];

Есть идеи?

Виталий NVGPRO (DIAFAN.CMS) 32425 октября 2015 г.

Как вариант. Можно не корректировать, а дополнить. Например, получив результат поиска в виде массива, можно одним проходом перебрать все его записи с последуещем присвоением значения (количество символов в вхождении). А затем ранжировать этот массив согласно этим значениям (максимальное значение в начало, минимальное в конец).

николай (111111) 325 октября 2015 г.

вот файлы которые за поиск отвечают
шнклудс/сеарчвордс
плагинс/стеммер

там можно как угодно настроить и создание индекса и поисковый алгоритм

Валерий Викторович (Sherrlok) 14427 октября 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
),

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


Сегодня вечером доберусь до сервера, попробую.

Валерий Викторович (Sherrlok) 14427 октября 2015 г.

Сделал как ТП рекомендовал, поиск вообще перестал находить что-либо.
Подозреваю, что наверно где-то изменился алгоритм за последние 1.5 месяца... А сайт не обновлял с 4 сентября...

Валерий Викторович (Sherrlok) 14427 октября 2015 г.

Но нет, поиск работает оказывается, но он начал искать с конца названий товаров! Вот дела!
Как заставить начать искать с начала названия товара?

Виталий NVGPRO (DIAFAN.CMS) 32427 октября 2015 г., редакция 27 октября 2015 г.

На мой взгляд у Вас желание связано с изменением механизма поиска. Вы решите эту задачу, но допустим разработчики сделают принципиально новый механизм поиска, который будет работать быстрее и лучше. Тогда Вам придется перерабатывать свое решение. Я бы Вам предлажил не корректировать сам механизм поиска, а работать с его результатом (фильтровать, ранжировать и т.п.). При таком подходе допустим будет задержка в работе скрипта на 0.005 сек. Зато вы спокойно будете обновлять свой сайт

Валерий Викторович (Sherrlok) 14427 октября 2015 г.

В общем-то предлагал лишь доработать имеющийся механизм.
А вот сам сайт не предполагал обновлять.

===
Хорошо, допустим приму во внимание ваше предложение. Вы очень красиво написали, а как это выполнить в коде?

Валерий Викторович (Sherrlok) 14427 октября 2015 г.

Ну а вообще, в ближайшей перспективе, планируем интегрировать "живой поиск". Т.е. тут однозначно проблемы при обновлении и к этому надо быть морально готовым. А проще вовсе не обновлять движок.

Валерий Викторович (Sherrlok) 14413 ноября 2015 г.

Забыл добавить:
Код
Правильный код:

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

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