Два года назад Петр Зайцев из попросил меня написать ему используя . Сейчас этот модуль работает на .
Данная статья будет полезна тем кто только начинает знакомится с Sphinx Search. Ее можно использовать как начальное руководство для написания простого поисковика на Sphinx Search.
Возможности плагина:
- Быстрый поиск, ну это и понятно, мы ведь используем Sphinx Search
- Возможность использовать расширенный синтаксис поиска ()
- Сортировка результатов поиска по дате или по релевантности
- Поиск по постам, комментариям или страницам. Это отличает этот плагин от стандартного поиска на 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 содержит дату добавления данных.
Поиск
Теперь рассмотрим как делать поиск, фильтрацию и сортировку используя атрибуты.
Пример:
- if ( empty($this->params['search_comments']) ){
- $this->config->sphinx->SetFilter('isComment', array(0));
- }
- if ( empty($this->params['search_pages']) ){
- $this->config->sphinx->SetFilter('isPage', array(0));
- }
- if ( empty($this->params['search_posts']) ){
- $this->config->sphinx->SetFilter('isPost', array(0));
- }
- if ( $this->params['search_sortby'] == 'date' ){ {
- $this->config->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'date_added');}
- } else {
- $this->config->sphinx->SetSortMode(SPH_SORT_RELEVANCE);
- }
- $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
- $opts = array(
- 'limit' => $this->config->admin_options['excerpt_limit'],
- 'around' => $this->config->admin_options['excerpt_around'],
- 'chunk_separator' => $this->config->admin_options['excerpt_chunk_separator'],
- 'after_match' => $this->config->admin_options['excerpt_after_match'.$isTitle],
- 'before_match' => $this->config->admin_options['excerpt_before_match'.$isTitle]
- );
- $excerpts = $this->config->sphinx->BuildExcerpts(
- $post_content,
- 'main_'.$this->config->admin_options['sphinx_index'],
- $this->search_string,
- $opts
- );
В параметрах этого метода надо указать строку результата в которой надо выделить слова, индекс, запрос и параметы выделения. В результате мы получем строку с подсвеченными ключевыми словами, которые пристуствовали в запросе.
В итоге как мы видим, написать свой поиск используя Sphinx Search достаточно просто. Если у вас большой блог и вы также хотите получить быстрый и много-функциональный поиск, тогда скачивайте — это бесплатно. :)
© Yaroslav Vorozhko for , 2009. |
|
|
Add to
Post tags: , , , ,
Комментариев нет:
Отправить комментарий