пятница, 25 декабря 2009 г.

Sphinx Search плагин поиска для Wordpress – поиск с Sphinx Search для начинающих

Два года назад Петр Зайцев из Percona попросил меня написать ему плагин поиска для WordPress используя Spinx Search. Сейчас этот модуль работает на mysqlperformanceblog.com.


Данная статья будет полезна тем кто только начинает знакомится с Sphinx Search. Ее можно использовать  как начальное руководство для написания простого поисковика на Sphinx Search.


Возможности плагина:



  • Быстрый поиск, ну это и понятно, мы ведь используем Sphinx Search

  • Возможность использовать расширенный синтаксис поиска (http://www.sphinxsearch.com/doc.html#extended-syntax)

  • Сортировка результатов поиска по дате или по релевантности

  • Поиск по постам, комментариям или страницам. Это отличает этот плагин от стандартного поиска на WP, который не производит поиск по комментариям и страницам. А также многие другие поисковые плагины не имеют такой возможности.

  • Есть возможность исключить из результатов поска комментарии, страницы или посты

  • И многие другие вкусности, про которые вы можете узнать на странице плагина


Все это позволяет нам делать Sphinx Search, и сейчас мы разеберем как это реализовано.


Конфигурационный файл


В первую очередь нам надо знать как устроен индекс. (sphinx.conf можно найти в каталоге rep/sphinx.conf)


Мы использовали самое простое решение это один монолитный индекс для всех данных: постов, страниц и комментариев. Формируется такой индекс единым SQL запросом, который приводить я тут не буду, он очень длинный и нас сейчас он не интересует (это все таки статья про Spihnx Search, а не про MySQL :) ), но посмотреть его можно в том же sphinx.conf.


Единственное, что нам стоит знать это какие атрибуты у нас есть:



  • comment_ID

  • post_ID

  • isPost

  • isComment

  • isPage

  • post_type

  • date_added


Атрибуты isPost, isComment и isPage отвечают за тип источника. date_added содержит дату добавления данных.


Поиск


Теперь рассмотрим как делать поиск, фильтрацию и сортировку используя атрибуты.

Пример:



CODE:




  1. if ( empty($this->params['search_comments']) ){



  2.     $this->config->sphinx->SetFilter('isComment', array(0));



  3. }



  4.                



  5. if ( empty($this->params['search_pages']) ){



  6.     $this->config->sphinx->SetFilter('isPage', array(0));



  7. }



  8.            



  9. if ( empty($this->params['search_posts']) ){



  10.     $this->config->sphinx->SetFilter('isPost', array(0));



  11. }



  12.        



  13.        



  14. if ( $this->params['search_sortby'] == 'date' ){ {



  15.     $this->config->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'date_added');}



  16. } else {



  17.     $this->config->sphinx->SetSortMode(SPH_SORT_RELEVANCE);



  18. }



  19.  



  20. $res = $this->config->sphinx->Query ( $this->search_string, $this->config->admin_options['sphinx_index'] ););







Первое, если один из аттрибутов не установлен, то с помощью SetFilter('isPost', array(0)) мы исключаем его из поиска.

Второе, если пользователь захотел отсортировать результаты по дате добавления, то мы испольязем режим сортировки по атрибуту SetSortMode(SPH_SORT_ATTR_DESC, 'date_added'). По умолчанию данные сортируются по релевантности.

И последнее мы выполняем собственно запрос с помощью метода Query(), первый параметр это запрос введенный пользователем, второй это индекс по которому выполнять поиск.


Результат поиска


Результат поиска мы должны обработать следующим образом:



  • Получить найденный идентификационные номера и по ним получить данные

  • Используя атрибуты isPost, isPage и isComment мы узнаем из какой таблицы получать данные

  • Потом объединяем полученный результат

  • И последнее мы выделяем ключевые слова в результата, путем добавления html тэга STRONG вокруг слова.


Выделение ключевых слов делает метод BuildExcerpts



CODE:




  1. $opts = array(



  2.     'limit'  => $this->config->admin_options['excerpt_limit'],



  3.     'around' => $this->config->admin_options['excerpt_around'],



  4.     'chunk_separator' => $this->config->admin_options['excerpt_chunk_separator'],



  5.     'after_match' => $this->config->admin_options['excerpt_after_match'.$isTitle],



  6.     'before_match' => $this->config->admin_options['excerpt_before_match'.$isTitle]



  7. );



  8.                    



  9. $excerpts = $this->config->sphinx->BuildExcerpts(



  10.     $post_content,



  11.         'main_'.$this->config->admin_options['sphinx_index'],



  12.     $this->search_string,



  13.     $opts



  14. );







В параметрах этого метода надо указать строку результата в которой надо выделить слова, индекс, запрос и параметы выделения.  В результате мы получем строку с подсвеченными ключевыми словами, которые пристуствовали в запросе.


В итоге как мы видим, написать свой поиск используя Sphinx Search достаточно просто. Если у вас большой блог и вы также хотите получить быстрый и много-функциональный поиск, тогда скачивайте WPSphinx плагин — это бесплатно. :)




© Yaroslav Vorozhko for Просто про веб технологии, 2009. |
Permalink |
No comment |
Add to
del.icio.us


Post tags: PHP, Plugin, Sphinx Search, wordpress, WPSphinx plugin

Комментариев нет:

Отправить комментарий