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 плагин - это бесплатно. :)

  1. Sych says:

    В умеліх руках сфинкс єто не только поиск а еще много разных вкусных плюшек

  2. Это точно, я не удивлюсь, что через годиков этак 5 сфинкс будет стандартом в поиске информации.
    По сути он сейчас представляет собой быстрый доступ к MySQL, и поэтому его применение безгранично настолько, насколько возможно применять базы данных.

  3. У меня плагин из админки WordPress не устанавливается, просто перекидывает в новое окно и никаких процессов не происходит.
    Подскажите пожалуйста, можно ли настроить плагин если sphinx в системе (Centos) уже установлен, и как это сделать?

    • Sergey, спасибо что воспользовались плагином :)
      По поводу установки:
      В админке пропишите путь к sphinx.conf постовляемому с плагином.
      Пропишите путь к searchd и indexer установленным в системе.
      Поле порт в админке должен соответствовать порту из sphinx.conf.
      Потом из админки запускаете searchd и индексацию.

      Если будут проблемы пишите, я обязательно на них отвечу.

      • Спасибо за быстрый ответ :)
        Все сделал, как вы указали, но:
        Пути в системе до /usr/bin/searchd и /usr/bin/indexer, но напротив них почему-то красным (Not exists)
        Запуск демона выдает:

        [20181] using config file '/var/www/new/wp-content/plugins/wordpress-sphinx-plugin/rep/sphinx.conf'...
        [20181] FATAL: failed to parse config file '/var/www/new/wp-content/plugins/wordpress-sphinx-plugin/rep/sphinx.conf'
        Sphinx 0.9.9-release (r2117)
        Copyright (c) 2001-2009, Andrew Aksyonoff

        ERROR: unknown key name 'source' in /var/www/new/wp-content/plugins/wordpress-sphinx-plugin/rep/sphinx.conf line 8 col 20.

        • Not exists возможно из за прав доступа на чтение ?
          При парсинге конфига иногда некоторые мета символы вызывают такую вот ошибку.
          Попробуй удалить пробелы до и после строки source - должно помочь.

  1. There are no trackbacks for this post yet.

Leave a Reply