Использую стандартный модуль поиска. Но он ищет только целые слова. Как сделать так, чтобы поиск производился и по частям слов (подсловам)? Т.е. например пользователь вводит только начало слова или конец или середину.
никто не откликнулся и готового подходящего решения я не нашел, поэтому сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова
Когда я писал первое сообщение в этой теме, то не мог привести решение. Хотел его выложить позже, но было много дел и я забыл про это. Так что приведу решение сейчас, надеюсь кому-нибудь еще оно поможет.
Для начала надо сделать кое-какие изменения в файле search.module
найдите строку
$query2 = substr(str_repeat("i.word = '%s' OR ", count($arguments2)), 0, -4);
и измените ее на
$query2 = substr(str_repeat("i.word LIKE '%%%s%%' OR ", count($arguments2)), 0, -4);
затем строку
$boundary = '(?:(?<=['. PREG_CLASS_SEARCH_EXCLUDE . PREG_CLASS_CJK .'])|(?=['. PREG_CLASS_SEARCH_EXCLUDE . PREG_CLASS_CJK .']))';
исправить на
$boundary = '';
потом найдите
if (count($ranges) == 0) {
return truncate_utf8($text, 256) .' ...';
}
и приведите к виду
if (count($ranges) == 0) {
return "bad";
}
в этом файле больше не надо делать какие-то еще изменения, теперь нам нужен node.module
найдите строку
$extra = node_invoke_nodeapi($node, 'search result');
и после нее добавьте
$snip=search_excerpt($keys, $node->title.$node->body);
if($snip!="bad")
{
строчку
'snippet' => search_excerpt($keys, $node->body),
измените на
'snippet' => $snip,
и теперь осталось только добавить } перед строкой return $results;
Вроде бы ничего не забыл.
Решение может быть и не самое лучшее и изящное, но пока оно меня устраивает.
Я новичок, сделала как описано, спасибо большое, aniv, все работает.
А можно ли это реализовать в пользовательских модулях, чтобы не корректировать стандартые модули после обновления версии?
Уважаемые гуры! Не оставьте нас, сирых, отправьте, пжл, этот патч разработчикам. Ну, не умеем мы (не все же монстры программирования)! Представляете, скольким людям доброе дело сделаете... Спасибо!
заметил один забавный баг: вводим в поиск 0 (ноль) и ... не получаем ничего ))) даже сообщения что ничего не найдено
а ещё когда результаты поиска не помещаются на одну страницу, кликаем по последней странице и иногда получаем сообщение "ничего не найдено" ... точно не понял в каких случаях так получается
Комментарии
никто не откликнулся и готового подходящего решения я не нашел, поэтому сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова
почему бы вам не выложить решение
Больше похоже на хваставство. Вы или привидите решение или сотрите [Решено] в заголовке...
Когда я писал первое сообщение в этой теме, то не мог привести решение. Хотел его выложить позже, но было много дел и я забыл про это. Так что приведу решение сейчас, надеюсь кому-нибудь еще оно поможет.
Для начала надо сделать кое-какие изменения в файле search.module
найдите строку
$query2 = substr(str_repeat("i.word = '%s' OR ", count($arguments2)), 0, -4);
и измените ее на
$query2 = substr(str_repeat("i.word LIKE '%%%s%%' OR ", count($arguments2)), 0, -4);
затем строку
$boundary = '(?:(?<=['. PREG_CLASS_SEARCH_EXCLUDE . PREG_CLASS_CJK .'])|(?=['. PREG_CLASS_SEARCH_EXCLUDE . PREG_CLASS_CJK .']))';
исправить на
$boundary = '';
потом найдите
if (count($ranges) == 0) {
return truncate_utf8($text, 256) .' ...';
}
и приведите к виду
if (count($ranges) == 0) {
return "bad";
}
в этом файле больше не надо делать какие-то еще изменения, теперь нам нужен node.module
найдите строку
$extra = node_invoke_nodeapi($node, 'search result');
и после нее добавьте
$snip=search_excerpt($keys, $node->title.$node->body);
if($snip!="bad")
{
строчку
'snippet' => search_excerpt($keys, $node->body),
измените на
'snippet' => $snip,
и теперь осталось только добавить } перед строкой return $results;
Вроде бы ничего не забыл.
Решение может быть и не самое лучшее и изящное, но пока оно меня устраивает.
Если node.module не трогать еще лучше работает...
Все работает. Спасибо!
Для себя и всех тех кому лень делать изменения ручками сделал патч-файл (см. приложенный файл).
aniv, а Вы не сможете выбрать время для отправки патча разработчикам?
Решение работает. Хотя расстраивает здесь то, что при каждом обновлении версии надо будет не забыть поправить модуль.
compawa, я еще ни разу не отправлял патчи и не знаю в какой форме и как их надо отправлять
Спасибо. Полезно
Я новичок, сделала как описано, спасибо большое, aniv, все работает.
А можно ли это реализовать в пользовательских модулях, чтобы не корректировать стандартые модули после обновления версии?
NataD
отлично работает, но почти не ищет в каталоге Ubercart (товары), а там больше всего надо
у меня тоже стоит уберкарт и поиск по товарам нормально работает
Уважаемые гуры! Не оставьте нас, сирых, отправьте, пжл, этот патч разработчикам. Ну, не умеем мы (не все же монстры программирования)! Представляете, скольким людям доброе дело сделаете... Спасибо!
заметил один забавный баг: вводим в поиск 0 (ноль) и ... не получаем ничего ))) даже сообщения что ничего не найдено
а ещё когда результаты поиска не помещаются на одну страницу, кликаем по последней странице и иногда получаем сообщение "ничего не найдено" ... точно не понял в каких случаях так получается
большое спасибо очень пригодилось
большое спасибо очень пригодилось
aniv, Вы могли бы поколдовать и для D7?
Уважаемые Гуру просвятите с решением для Drupal 7
drupal 6:
for english letters: http://drupal.org/project/porterstemmer
для русских: http://drupal.org/project/rustemmer
drupal 7 портирование модуля rustemmer: http://drupal.org/node/1034298
Порт rustemmer под 7-ку http://drupal.org/node/1034298#comment-4753064
Может кто посмотрит знающий в конце вот этой темы поиск в друпал вопрос возник. Перерыл все что можно не могу найти ответ.
Спасибо aniv. Как раз искал решение этой проблемы.
Изменил только search.module и всё работает на УРА.
Попробуйте этот модуль поиска вместо стандартного http://www.drupal.ru/node/83705
Интересно, а как в joomla сделан поиск по частям слова? Неужели он всю базу через like %строка% гоняет? Это же огромная нагрузка на базу и полный перебор без использования индексов.
Вот пример как это работает у жумлы: http://www.joomla.ru/component/search/?searchword=%D1%81%D0%BF%D0%BB%D0%...