Doctrine: Поиск русском языке

Symfony framework

Автор: Александр Степанов

5 февр. 2013 г., 09:55:40  1728


На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк 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...