Здравствуйте, уважаемые. На днях у меня встала задача к самописному компоненту приделать поиск. Хороший поиск. Быстрый и с русским морфологическим разбором. Можно, конечно, подключить поиск от Яндекс или
Google, но это запасной вариант. Тем более, что сайт еще только в локальном варианте и на каком доменном имени он будет висеть, еще заказчик не определился.
Знакомство с Умным поиском в Joomla порадовало. Но не очень. Порадовало, что прикрутить его к своему компоненту оказалось не сложно. Нужно взять один из плагинов в папке plugins\finder\ и переписать под свой компонент. На этом моменте я останавливаться не буду, потому как это очень зависит от того компонента, к которому прикручивается умный поиск. Хотя, если появятся желающие узнать подробности, то постараюсь ответить. Те плагины, которые уже установлены в Joomla, позволяют использовать Умный поиск в материалах, категориях, контактах, web-ссылках и лентах новостей.
А что же меня не порадовало? А собственно то, что никакой морфологический разбор для русского языка в Joomla не предусмотрен. Какое ввели слово, такое слово и будет искать.
Поиски в интернете стеммера для русского языка дали обнадеживающие результаты. Нашлось несколько стеммеров Портера для русского языка. Ядро у них всех было одинаковым, видимо автор один. К сожалению, я не знаю имени автора, но в любом случае ему спасибо. Я взял стеммер для Wordpress и переписал его для Joomla.
Ссылка на файл porter_ru.php: http://redozator.ru/files/porter_ru.zip. Чтобы его установить, нужно:
1. Поместить его в папку administrator\components\com_finder\helpers\indexer\stemmer\
2. В файле administrator\components\com_finder\config.xml ищем описание поля stemmer и вставляем строчку
<option value="porter_ru">rus stemmer</option>
В версии Joomla 2.5.6 это 201-я строка файла config.xml.
3. В админ. панели, в настройках умного поиска выбираем в поле Парадигматический модуль наш новый стеммер rus stemmer.
"И чо?" - скажите вы, - "почему не работает?". Я сам удивлен! Действительно не работает. Точнее работает, но кое-как. Пришлось копать глубже в код компонента умного поиска. Без хака не обошлось.
4. Открываем файл administrator\components\com_finder\helpers\indexer\query.php и изменяем строку 1305
было:
$query->where('t.term = ' . $db->quote($token->term));
стало:
$query->where('(t.term = ' . $db->quote($token->term). ' OR t.stem = ' . $db->quote($token->stem). ' OR t.stem = ' . $db->quote($token->term). ')');
5. Проверяем работу.
6. Задаем мне вопросы, если что-то не понятно.