Pull to refresh

Zend_Search_Lucene + PHPMorphy — это просто

Reading time 2 min
Views 2.7K
Когда-то смотрел документацию по Zend_Search_Lucene. Все хорошо, все понятно. Бери и встраивай в свой сайт. Только вот ни слова там нету про то, каким образом прикрутить стеммер или морфологический анализатор к этой штуке. На деле оказалось, что подружить его, например, с PHPMorphy, очень просто.
Собственно, как это сделать — под катом.
Заметка в первую очередь будет полезна разработчикам, перед которыми проблема полнотекстового поиска на сайте еще не стояла.
Тут вы не найдете мануала по настройке Lucene или PHPMorphy — этой информации и так предостаточно в интернете.


Итак, приступим.
Перед добавлением в индекс текст разбивается на токены. За то, каким образом это происходит, отвечают классы Zend_Search_Lucene_Analysis_Analyzer_*. На входе анализатора — текст, на выходе — список токенов. Токен — это слово, которое непосредственно пишется в индекс + его позиция в документе. По крайней мере я это понимаю именно так. Также кроме анализатора имеются фильтры, которые преобразовывают слова, скажем, к нижнему регистру, или не пропускают слова короче трех букв.
Все, что нам надо сделать, это написать фильтр, который будет преобразовывать слово к какой-то начальной форме. Эта форма и сохранится в индексе. Забыл сказать. Все запросы к индексу тоже проходят такую же процедуру токенизации и фильтрации. Таким образом, поиск будет осуществляться по начальным формам слов, что нам, собственно, и надо. Ниже код:

class My_PHPMorphy_TokenFilter extends Zend_Search_Lucene_Analysis_TokenFilter
{
    public function normalize(Zend_Search_Lucene_Analysis_Token $srcToken)
    {
        // смотрим в Zend_Search_Lucene_Analysis_TokenFilter_LowerCaseUtf8
        // и делаем точно так же
    }
} 

$analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8();

$analyzer->addFilter(new My_PHPMorphy_TokenFilter());

Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);


Все. Индексируем что надо и выводим результаты поиска пользователю, как учат нас в мануале по Zend_Framework.
Tags:
Hubs:
+9
Comments 3
Comments Comments 3

Articles