[Решено] Поиск по части слова
Прислано: aniv
чт, 26/03/2009 - 12:17
Использую стандартный модуль поиска. Но он ищет только целые слова. Как сделать так, чтобы поиск производился и по частям слов (подсловам)? Т.е. например пользователь вводит только начало слова или конец или середину.
- aniv's blog
- Для комментирования войдите или зарегистрируйтесь
никто не откликнулся и готового подходящего решения я не нашел, поэтому сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова
- Для комментирования войдите или зарегистрируйтесь
почему бы вам не выложить решение
- Для комментирования войдите или зарегистрируйтесь
сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова
Больше похоже на хваставство. Вы или привидите решение или сотрите [Решено] в заголовке...
- Для комментирования войдите или зарегистрируйтесь
Когда я писал первое сообщение в этой теме, то не мог привести решение. Хотел его выложить позже, но было много дел и я забыл про это. Так что приведу решение сейчас, надеюсь кому-нибудь еще оно поможет.
Для начала надо сделать кое-какие изменения в файле 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
- Для комментирования войдите или зарегистрируйтесь
Может кто посмотрит знающий в конце вот этой темы поиск в друпал вопрос возник. Перерыл все что можно не могу найти ответ.
- Для комментирования войдите или зарегистрируйтесь






Комментарии