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

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

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

0 Thanks

Комментарии

Аватар пользователя 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

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

Аватар пользователя aniv aniv 4 мая 2009 в 21:22

compawa, я еще ни разу не отправлял патчи и не знаю в какой форме и как их надо отправлять

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

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

NataD

Аватар пользователя jin123 jin123 3 августа 2009 в 20:03

отлично работает, но почти не ищет в каталоге Ubercart (товары), а там больше всего надо :(

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

у меня тоже стоит уберкарт и поиск по товарам нормально работает

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

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

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

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

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

Аватар пользователя AntonD AntonD 4 июня 2012 в 16:18

Спасибо aniv. Как раз искал решение этой проблемы.
Изменил только search.module и всё работает на УРА.

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

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