Doctrine: Поиск русском языке
На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк Symfony. В официальном гайде используется Zend Lucene – поисковой движок от Zend, но для многих сайтов его функционал избыточен, да и подключение к проекту Symfony не совсем очевидно. В данной статье мы рассмотрим простую реализацию полнотекстового поиска с использование фреймворка Symfony и ORM Doctrine. Схема таблицы Для примера, поиск будет осуществляться по некоторой таблице article. Ее схема:
StArticle:
actAs:
Timestampable: ~
columns:
title:
type: string(255)
notnull: true
text:
type: string
notnull: true
Для возможности реализации поиска, нужно добавить поведение Searchable:
StArticle:
actAs:
# ...
Searchable:
fields: [title, text]
analyzer: Doctrine_Search_Analyzer_Utf8
В fields задаются поля, по которым осуществляется поиск. В analyzer задается так называемый «анализатор» текста. То, что мы задали Doctrine_Search_Analyzer_Utf8, позволит избежать возможных проблем с кириллицей. К слову говоря, можно определить и собственный анализатор, достаточно наследоваться от интерфейса Doctrine_Search_Analyzer_Interface и переопределить метод analyze():
class MyAnalyzer implements Doctrine_Search_Analyzer_Interface
{
public function analyze($text)
{
$text = trim($text);
return $text;
}
}
Теперь схема таблицы полностью готова и подходит для поиска. После генерации и выполнения SQL кода (doctrine:build –all) в базе появится таблица Article и так же создастся таблица article_index - так называемый полнотекстовый индекс – словарь, в котором перечислены слова и указано, в каких местах они встречаются. Поиск в Doctrine Поиск будет реализован при помощи метода search, определенного в классе Doctrine_Search...