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

Главные вкладки

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

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

Комментарии

Аватар пользователя aniv aniv 1 апреля 2009 в 21:46

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

Аватар пользователя Serg_M Serg_M 8 апреля 2009 в 11:11

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

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

Аватар пользователя aniv aniv 26 апреля 2009 в 19:05

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

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

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

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

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

Аватар пользователя sva sva 1 мая 2009 в 21:28

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

Аватар пользователя NataD NataD 26 мая 2009 в 13:38

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

NataD

Аватар пользователя Izem Izem 13 августа 2009 в 20:58

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

Аватар пользователя ibest ibest 14 сентября 2009 в 23:07

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

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

Аватар пользователя Murz Murz 19 декабря 2012 в 13:15

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