Symfony::Поиск. Часть 1

На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк Symfony. В официальном гайде используется Zend Lucene – поисковой движок от Zend, но для многих сайтов его функционал избыточен, да и подключение к проекту Symfony не совсем очевидно.

В данной статье мы рассмотрим простую реализацию полнотекстового поиска с использование фреймворка Symfony и ORM Doctrine.

Схема таблицы

Для примера, поиск будет осуществляться по некоторой таблице article. Ее схема:

  1. StArticle:
  2.   actAs:
  3.     Timestampable: ~
  4.   columns:
  5.     title:
  6.       type: string(255)
  7.       notnull:  true
  8.     text:
  9.       type: string
  10.       notnull: true

Для возможности реализации поиска, нужно добавить поведение Searchable:

  1. StArticle:
  2.   actAs:
  3.     # ...
  4.     Searchable:
  5.       fields: [title, text]
  6.       analyzer: Doctrine_Search_Analyzer_Utf8
  7. # ...

В fields задаются поля, по которым осуществляется поиск. В analyzer задается так называемый «анализатор» текста. То, что мы задали Doctrine_Search_Analyzer_Utf8, позволит избежать возможных проблем с кириллицей. К слову говоря, можно определить и собственный анализатор, достаточно наследоваться от интерфейса Doctrine_Search_Analyzer_Interface и переопределить метод analyze():

  1. class MyAnalyzer implements Doctrine_Search_Analyzer_Interface
  2. {
  3.     public function analyze($text)
  4.     {
  5.         $text = trim($text);
  6.         return $text;
  7.     }
  8. }

Теперь схема таблицы полностью готова и подходит для поиска. После генерации и выполнения SQL кода (doctrine:build –all) в базе появится таблица Article и так же создастся таблица article_index - так называемый полнотекстовый индекс – словарь, в котором перечислены слова и указано, в каких местах они встречаются.

Поиск в Doctrine

Поиск будет реализован при помощи метода search, определенного в классе Doctrine_Search...

php, symfony, doctrine