Projects

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

Posted in PHP, Sphinx Search, WPSphinx plugin on December 23rd, 2009 by Yaroslav Vorozhko – 2 Comments

Два года назад Петр Зайцев из 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 плагин - это бесплатно. :)

Как вы используете Sphinx Search API?

Posted in Development, LinkAider, Projects, Sphinx Search, ZendFramework on December 21st, 2009 by Yaroslav Vorozhko – Be the first to comment

Sphinx Search API для PHP пердставляет собой единый класс, который позволяет использовать все возможности Sphinx Search через его интерфейс. Но, такой класс является удобным только для небольших скриптов и задач.
Для более сложных задач и больших веб приложений необходимо другое решение. И это решения является проектированием и реализацией собственной обертки для Sphinx Search API.

В нашем проекте LinkAider.com мы используем следующие понятия и классы при работе с Sphinx Search:

  1. Сфинкс клиент, отвечающий за подключение, выполнение запросов и обработку ошибок. Для разработчика сфинкс клиент невидим, мы только сообщаем ему параметры подключения к searchd.
  2. Сфинкс индекс - это один из основных классов, с которым работает разработчик, этот класс отвечает за формирование запросов и выполнение запросов через Сфинкс клиент, а также за обработку результатов запроса.
  3. Сфинкс запрос - это еще один класс к которому обращается разработчик для составления запросов. Каждый запрос отвечает за свои индекс к которому обращается, а также содержит свои фильтры, группировки, сортировки и собственно сам запрос.
  4. Сфинкс результат - это класс, который разбирает ответ сфинкса и предоставляет удобный интерфейс к информации по каждому запросу, также он содержит информацию об ошибках, которую испльзуетя Сфинкс клиент для логирования. Сфинкс результат используется разработчиками для создания запросов к базе данных и получения искомых данных.

Пример работы выглядит следующим образом:

  1. Мы создаем объект Сфинкс индекс, который инициализирует Сфинкс клиент, устанавливая для него параметры подключения.
  2. Потом мы создаем объекты запросы для каждого указываем фильтры, группировки и т.п., и указываем к какому индексу делать запрос. Запросов может быть один или несколько, несколько запросов обрабатываються паралельно, что улучшает общую производительность системы.
  3. Каждый созданный запрос мы добавляем в Сфинкс индекс, при добавлении мы можем также указатьк какому индексу делать запрос.
  4. Специальный метод Run класса Сфинкс индекс запускает все запросы и как результат возвращает нам объект Сфинкс результат.
  5. Данные из Сфинкс результата мы используем чтоб создать запросы к базе данных и получить искомые данные.

Преимущеста, которые мы получем от работы с такой библотекой - это простота. Разработчик используя объект Сфинкс запрос может выполнять любые запросы.
Сфинкс результат предоставляет удобную обертку над массивом результата.
Нет необходимости помнить множество констант SphinxClient и парсить массив результата. В общем это выглдит так, как будто вы работаете с обычной таблицой, но не до конца. :)

Недостатки в том, что нам все еще приходится вручную связывать результат с таблицами, что может привести к ошибкам и неэффективному коду.

Решение я вижу, в привязке каждого запроса к определенной таблице или группе таблиц.

По описнной выше логике я разрабатываю модуль Sphinx Search для Zend Framework, который я планирую выложить в откртый доступ очень скоро, возможно к новому году.

Поэтому хотелось бы узнать как вы используете Sphinx Search и какие преимущества и недостатки вывидите у вашего подхода.

Буду рад любым советам и рекомендациям.

Отчет DOU от LinkAider.com

Posted in Projects, Tips And Tricks on July 24th, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет!

В интернете появился новый сервис анализа сайтов - LinkAider.com. В основном он будет полезен SEO и веб-мастерам.

Решил на нем проверить сайт developers.org.ua, было проверено 10,000 страниц и 948,485 ссылок. Каждая страница запрашивалась не чаще, чем 1 раз в 2 секунды, вложенность кравла не ограничена и кравлер учитывал правила robots.txt.

Резултаты проверки DOU.

Что интересного в отчете:

1. Было найдено 1,288 битых ссылок на 713 страницах, это 0.001% от общего количества проверенных ссылок, что очень хорошо.

2. Среднее количество ссылок на странице 94,85, но есть страницы на которых 500 и более ссылок, отчет.

3. Также есть страницы размер которых выше 500Кб, отчет.

4. Заголовок (мета тег Title) "Средние зарплаты - сообщество программистов" повторяется на 2,182 страницах (это 20% от просмотренных страниц!) и "developers.org.ua › Log In" повторяется на 1,708 страницах.

Битые ссылки, чаще всего это 404 ошибка, всегда являлась проблемой для любого сайта. Такие страницы могут говорить о проблеме в коде этой страницы или о банальной опечатке при наборе ссылки.
Большое количество ссылок на странице, может сигнализировать о наличии спам ссылок на опасные(вирусные) или запрещенные сайты.
Страницы размером свыше 1Мб, могут быть не доступны для некоторого сегмента пользователей и такие страницы создают избыточную нагрузку на сервер.
Повторение заголовков плохо сказывается на SEO сайта, что уменьшает ее вес в поисковиках, таких как Google

Регистрируйтесь и высказывайте свое мнение по сервису, регистрация бесплатно.

Все мнения будут учтены.

С уважением, Web developer LinkAider.com

Del.icio.us : , , ,
Technorati : , , ,

ProductSearch #4 Разработка требований. Масштабы и ограничения проекта

Posted in Product Search on July 14th, 2008 by Yaroslav Vorozhko – Be the first to comment

granizi_proekta Когда химик изобретает новую химическую реакцию, которая преобразует один тип химиката в другой, он пишет документ, в который входит раздел "Рамки и ограничения", где описывает, что получиться и не получиться в результате этой реакции.

Карл Вигерс. Разработка требований к программному обеспечению

Точно также для проекта по рарзаботке ПО следует определить его рамки и ограничения. Вам необходимо указать, что может делать система, а что не может.

Границы проекта определяют концепцию и круг действия предложенного решения. В ограничениях указываются определенные возможности, которые не будут включены в продукт. Рамки и ограничения помогают установить реалистичные ожидания заинтересованных лиц.

Объем первоночальной версии ProductSearch

Чтоб определить объем первоначальной версии, надо постараться обобщить основные запланированные функции и включить только самое необходимое в первую версию продукта.

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

Сосредоточтесь на наиболее ценных функциях, имеющих максимально приемлемую стоимость, годных для самой широкой целевой аудитории, которые удастся создать как можно раньше.

read more »

ProductSearch #3 Разработка требований. Образ Проекта

Posted in Product Search on July 10th, 2008 by Yaroslav Vorozhko – Be the first to comment

moonrise_sts35 Образ проекта обеспечивает основу для принятия решений в течении жизненного цикла продукта.

Карл Вигерс. Разработка требований к программному обеспечению

Положение об образе проекта

Положение об образе проекта выглядит следующим образом:
Система предназначена для покупателей и поставщиков, покупателям нужна возможность запрашивать информацию о имеющихся продуктах и выбирать наиболее оптимальных поставщиков, а поставщикам возможность добавлять продукты и следить за ними на основе отчетов, данная система ProductSearch является информационной системой, которая обеспечит единую точку доступа к продуктам и поставщикам системы.

Система будет знать техническую информацию о продуктах, цену, историю изменения цены, информацию о поставщиках и информацию о действиях клиентов,
что позволит искать, сравнивать продукты, выбирать оптимальных поставщиков и
оптимизировать систему и ее содержимое на основе отчетов о покупателях.

Система будет хранить полную историю изменения цен. Эта система сэкономит покупателю время на принятие решения о покупке, а поставщику позволит более точно подходить к выбору добавляемых продуктов и рекламе собственного товара.

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

Основные функции

  • Поиск продуктов;
  • Сравнение двух и более продуктов;
  • Возможность проследить история изменения цены продукта;
  • Возможность создать и просмотреть отзывы о продукте;
  • Выбор лучшего поставщика продукта по параметру цена-качество;
  • Регистрация поставщиков;
  • Добавление потока продуктов поставщиками;
  • Аналитические отчеты для поставщиков.

ProductSearch #2 Разработка требований. Бизнес-план

Posted in Product Search on July 6th, 2008 by Yaroslav Vorozhko – 3 Comments

bsplan

Продолжаем разрабатывать ProductSearch.

Вводная статья про разрабатываемый продукт: Создание проекта ProductSearch.
И статья про разработку требований - Бизнес-требования.

Бизнес-требования определяют и набор бизнес-задач (вариантов использования), которые позволяет выполнять приложение (ширина приложения), и глубину уровня, до которого реализуется каждый вариант использования.

Если бизнес-требования помогают вам определить, что некий вариант использования выходит за границы проекта, значит, что вы принимаете решение о ширине проекта.
Глубина простирается от простой реализации до полной автоматизации с множеством вспомогательных средств.

Бизнес-требования позволяют понять, для каких вариантов использования необходима надежная и полная функциональность, а для каких достаточно поверхностной реализации, по крайней мере на первое время.

Карл Вигерс. Разработка требований к программному обеспечению

Написание бизнес-требований, целей и видения продукта сложная тема,
и для меня в каком-то смысле нова. Поэтому, мне было бы интересно услышать Ваше мнение про все ниже написанное.

План создания бизнес модели продукта:

  • Исходные данные
  • Возможности бизнеса
  • Бизнес-цели и критерии успеха
  • Потребности клиента
  • Бизнес риски

read more »

ProductSearch #1 Разработка требований. Бизнес-требования

Posted in Development, Product Search on June 26th, 2008 by Yaroslav Vorozhko – 2 Comments

Продолжаем разрабатывать ProductSearch. Прежде чем читать дальше, советую ознакомиться с первой статьей про ProductSearch, где я описал цели и общий план развития проекта.

В этой статья я буду вести речь про требования к ПО - кратко, что такое требования и какие бизнес-требования я определил для ProductSearch. 

Определение термина "требования к ПО", Карл Вигерс определил как:

Требования к ПО состоят из трех уровней - бизнес требования, требования пользователей и функциональные требования. Вдобавок каждая система имеет свои нефункциональные требования.

Следующий рисунок демонстрирует способ представления этих требований:

Виегерс Требования

В первую очередь надо разработать бизнес-требования.
Что такое бизнес-требования:

Бизнес-требования (business requirements) содержат высокоуровневые цели организации или заказчиков системы. Как правило, их высказывают те, кто финансируют проект, покупатели системы, менеджер реальных пользователей, отдел маркетинга. В этом документе объясняется, почему организации нужна такая система, то есть описаны цели, которые организация намерена достичь с ее помощью.

read more »