[Решено] Поиск по части слова

26 марта 2009 в 15:17
Аватар пользователя aniv aniv 0 25

Использую стандартный модуль поиска. Но он ищет только целые слова. Как сделать так, чтобы поиск производился и по частям слов (подсловам)? Т.е. например пользователь вводит только начало слова или конец или середину.

Комментарии

никто не откликнулся и готового подходящего решения я не нашел, поэтому сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова

1 апреля 2009 в 21:46

"Dark_kz" wrote:
сам модифицировал стандартную функцию поиска и теперь у меня работает поиск по любой части слова

Больше похоже на хваставство. Вы или привидите решение или сотрите [Решено] в заголовке...

8 апреля 2009 в 11:11

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

Для начала надо сделать кое-какие изменения в файле 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;

Вроде бы ничего не забыл.
Решение может быть и не самое лучшее и изящное, но пока оно меня устраивает.

26 апреля 2009 в 19:05

Все работает. Спасибо!
Для себя и всех тех кому лень делать изменения ручками сделал патч-файл (см. приложенный файл).

10 ноября 2015 в 11:47
Аватар пользователя sva sva 0

Решение работает. Хотя расстраивает здесь то, что при каждом обновлении версии надо будет не забыть поправить модуль.

1 мая 2009 в 21:28

Я новичок, сделала как описано, спасибо большое, aniv, все работает.
А можно ли это реализовать в пользовательских модулях, чтобы не корректировать стандартые модули после обновления версии?

NataD

26 мая 2009 в 13:38

Уважаемые гуры! Не оставьте нас, сирых, отправьте, пжл, этот патч разработчикам. Ну, не умеем мы (не все же монстры программирования)! Smile Представляете, скольким людям доброе дело сделаете... Спасибо!

13 августа 2009 в 20:58

заметил один забавный баг: вводим в поиск 0 (ноль) и ... не получаем ничего ))) даже сообщения что ничего не найдено

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

14 сентября 2009 в 23:07

Интересно, а как в joomla сделан поиск по частям слова? Неужели он всю базу через like %строка% гоняет? Это же огромная нагрузка на базу и полный перебор без использования индексов.
Вот пример как это работает у жумлы: http://www.joomla.ru/component/search/?searchword=%D1%81%D0%BF%D0%BB%D0%...

19 декабря 2012 в 13:15