Статьи
Портфолио
Друзья
Контакты

Последние статьи

24.02.2012 ZFConf 2012 пройдет весной в Москве! (0)

15.10.2011 Zend Framework Day 2011, 12 ноября, Киев (0)

27.09.2011 MSSQL, XML и PHP. Как заставить это работать из под *nix? (0)

Все

Категории

PHP (2)

Zend Framework (33)

Javascript (4)

Другое (13)

Книги (1)

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  open search  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  Я читаю  Книги  sphinx  софт  массовые рассылки  хранение данных 

Все

Статистика



Новые гламурные модели vertu в интернет магазине ВИП vertu.
в магазине купить шины киев в АвтоСити
Незнаеш где купить флешку в Одессе? Тогда тебе к нам.
Каталог мебели Пинскдрев, мебель беларуси Украина.

Главная > Статьи > PHP > Быстро ищем - Sphinx Search Engine
20.09.09 Быстро ищем - Sphinx Search Engine

Логотип SphinxПривет всем. Вот вырвал кусок времени из своего нынешнего плотного графика работы, чтобы поделиться с Вами довольно интересным материалом об очень быстром и эффективном автономном поисковом движке - Sphinx.

 

 

Что такое Sphinx?


 

Бесплатный поисковый движек, созданный для индексации содержимого баз данных и поиска по созданным индексам. Распространяется по лицензии GNU General Public License v.2. Поддерживает PostgreSQL и MySQL.

 

 

Основные фичи


  • Высокая скорость индексации (до 10 мб/с !)
  • Высокая скорость поиска (за 0.1 с. на 2-4 гигабайтном индексе !)
  • Высокая степень масштабируемости
  • Поддержка распределенного поиска
  • Поддерживает поиск по фразам
  • Поддерживает ранжирование фразы по близости, что обеспечивает хорошую релевантность
  • Поддерживает русский и английский стемминг
  • Неограниченное количество полей на документ, вес которых может быть изменен на лету
  • Группировка документов
  • Стоп-слова
  • Разные режимы работы
  • Общий интерфейс XML
  • Клиент на чистом PHP - нет необходимости чего-то компилировать

 

 

Установка (под Windows)



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

  1. Скачайте дистрибутив Sphinx
  2. Распакуйте архив на локальный диск
  3. Скопируйте файл libmysql.dll (найдите на сервере в файлах установки MySQL) в папку bin
  4. Создайте в папке bin конфигурационный файл sphinx.conf
  5. Настройте Sphinx с помощью конфиг-файла, как описано в мануале
  6. Запустите файл /path/to/sphinx/bin/indexer.exe с параметрами: --config /path/to/sphinx/sphinx.conf --all
  7. Если все хорошо, то должен создаться индекс (не забудьте про абсолютные пути в конфиге + должны быть созданы папки для логов и файлов индекса)
  8. Далее запустите файл /path/to/sphinx/bin/searchd.exe с параметрами: --install --config /path/to/sphinx.conf. Эта операция должна создать новую службу под названием "searchd"
  9. Запустите службу searchd

Установка Sphinx как службы Windows

Вот пример реального конфигурационного файла:

Все, установка Sphinx завершена. Рекомендую написать .bat файл для удобства переиндексирования БД. Если возникают проблемы — запустите searchd.exe из командной строки с параметром --config /path/to/sphinx.conf. Все ошибки должны появится тут. Вообще с установкой я очень долго просидел, потому, что таких нюансов, как Вам показываю, не знал, поэтому у Вас должно быть намного меньше трудностей Подмигивает

 

 

Работа с Sphinx


 

Sphinx имеет свой API. В папке с распакованным дистрибутивом есть папка api. В этой папке Вы можете найти файл sphinxapi.php. Скопируйте данный файл в Ваш проект и подключите его.

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

Этот код Вы можете немного поправить под свои нужды и сбросить на сервер, чтобы протестировать работоспособность Вашего автономного веб-поиска.

 

 

Итог


 

Сфинкс — очень шустрый автономный поисковый движек. Он очень прост в использовании - это только на первый взгляд он довольно сложный в установке и использовании. Все вопросы жду в каментах. Удачи.

Теги:  php, sphinx

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги
Комментарии к статье
  Snowcore

05.10.09 12:42:34

Да, Sphinx намного шустрее PHP реализации Lucene (ZF)...

  illusive

05.10.09 15:28:07

В разы шустрее!

  Deloff

10.12.09 00:13:28

Сфинкс очень мощная штука. Шутя работает с 7 гигосами данных (темы на форуме)

  kosta

29.01.10 18:44:29

А его можно настроить на индексацию не базы, а xml файлов?

  Дмитрий

30.05.10 17:03:02

Ребят, а вот такой вопрос. 
Нужно разработать бота, собирающего данные с указанных источников с пост-очисткой от рудиментов 
Данные: источник сбора, товар, цена 

Бот должен по таймеру залезать на каждый требуемый ресурс (список ресурсов определяет пользователь), собирать информацию и складывать ее в базу данных в требуемом виде. Информация – это прайс-лист с товарами, в одном прайс-листе может быть от 1000 до 30000 товаров, т.о. речь идет о достаточно большом массиве данных.   

Задача бота – собирать информацию с 100-500 ресурсов в день и обновлять данные в БД. Предположительно, сохранять данные можно в SQL   

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

Может ли этот движок помочь в решении подобной задачи?

  illusive

31.05.10 10:21:55

Насколько я понял задачу, то не может т.к. он индексирует только БД..

  NBST

28.06.10 09:35:16

А где учебник по сфинксу найти?

  illusive

29.06.10 10:28:22

На официальном сайте, конечно http://www.sphinxsearch.com/docs/

  Pendalff

25.08.10 15:25:48

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

  illusive

25.08.10 21:01:38

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

  White

03.10.11 16:15:15

Здравствуйте. 
Подскажите, пожалуйста:) 
Установил на локалке, все работает ок.
А как на сервере запустить? 
через CMD захожу на свой FTP, а там exe не выполняются. Может, кто чем подскажит:) Спасибо.

  illusive

13.10.11 11:49:00

White, совсем непонятно о чем вы.

Какой FTP? 

  Виталий

05.02.12 16:52:00

Благодарю, коллега. :)

Я тоже лоб расшиб об настройки sphinx, несколько часов потратил, запустил, наконец-то. А потом наткнулся на Вашу статью. :)) Ну да ладно, лучше поздно... 

  Serge

19.04.12 09:59:18

Скажите, а на какой основе Вы выводите результат поиска ? Имею в виду то, что получает пользователь задавая запрос в строке.

Несколько индексов берутся из нескольких баз данных MySql (пусть даже одинаковых по структуре, на одном сервере, с тем же пользователем).

Но как вывести результат красиво ?

У меня получается запрос к ОДНОЙ базе MySQL по результатам отобранным Сфинксом, все в порядке с выводом результата.

Ну а если этих баз 5-7 ? Мало иметь хороший индекс Сфинкса  Улыбается там-то он найдет данные по всем 5-7.

А вот как вывести результат по 5-7 базам ? в коде прописывать на каждую базу стандарт

// CONNECT WITH MYSQL
  mysql_connect('localhost', 'USER', 'passw');
mysql_select_db('a01');

  mysql_connect('localhost', 'USER', 'passw');
  mysql_select_db('a02');

и тд - подключаем базу а03, а04....?

есть ли более прямой или более умный Улыбается способ ?

С уважением,

 

 

  illusive

19.04.12 10:13:17

Честно говоря не совсем понял Ваш вопрос..

Попробую ответить так, как понял.
У Вас есть источники (source) в Sphinx, и у Вас есть возможность по клиентскому API обратиться к нескольким источникам Сфинкса подав один запрос сразу к перечню индексов (в index указываются источники). Соответственно, Вы получаете один ответ Сфинкса и для вывода данных пользователю у Вас есть два варианта:

  1. В ответах Сфинкса поместить какой-то флаг (sql_attr_uint, секция source конфига Sphinx), например. По этому флагу определять из какого источника получены данные и подтянуть недостающее из соотв. БД
  2. Хранить в тех же атрибутах значение тех полей, которые Вы выводите пользователю и таким образом полностью избежать обращения к БД.

  Serge

19.04.12 11:26:06

Благодарю за намек в какую сторону идти :)
Если можно, опубликую часть кода чтобы было предметнее...
//...с началом понятно, далее :

// (* результат - все индексы)
$result = $sphinx->Query($string, '*');

// Если он есть то...
if ($result && isset($result['matches']))

{
...до этого момента все хорошо - но вот далее не могу разобраться.

Возьму Ваш способ номер 1 (поскольку заранее заданные значения полей меня смущают по логике...говоря простым языком если я задал sql_attr_name = KIEV - значит везде в результатах где выведен "sql_attr_name =" я и буду всегда видеть слово KIEV...так ? а это переменная в зависимости от значения конкретного поля в БД что дал поиск Сфинкса - то есть все же реальные данные надо подтягивать из MySQL). Правильно понимаю ?

Правда не совсем понимаю как можно "подтянуть недостающее звено из соответствующей БД" (и тем более звенья из 10 БД) не указывая нигде в скрипте опять-таки  привычные
mysql_connect('localhost', 'USER', 'passw');
mysql_select_db('a01'); и тд...а02, а03...
Надеюсь есть в Сфинксе такое скрытое колдунство...

ПРИМЕР - СФИНКС проиндексировал 5 баз данных MySQL по 4 полям
id, name, content, tags
Предположим я указал в конфиге флаги (могу ведь произвольно добавлять ?)
sql_attr_name = name
sql_attr_content = content
sql_attr_tags = tags

// Выводим массив
$ids = array_keys($result['matches']);

И что далее написать чтобы

1) установить кодировку НЕ средствами MySQL как ниже
// SET CODING
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');


2) отсортировать результат по релевантности (не обращаясь к MySQL за параметрами) ?
Для одной (!) базы MySQL это было бы
$id_list = implode(',', $ids);
$sql = sprintf('SELECT * FROM `products` WHERE`id` IN (%s) ORDER BY FIELD(`id`, %s)', $id_list, $id_list);
$resource = mysql_query($sql);

3) вывести результаты поиска в обычный вид для пользователя - ИСПОЛЬЗУЯ ФЛАГИ как Вы советуете
Опять же для одной базы MySQL это работает как
echo '<ol>';
while ($result = mysql_fetch_assoc($resource)) {
echo '<li><span><a href="&"quot;http://yoursite.com/'.$result['group_id'].'/?p='.$result['id'].'">'.$result['name'].'</a></span><div>'.mb_substr(htmlspecialchars($result['description']), 0, 200).'</div>';
}
echo '</ol>';

В результате имеем - NAME как гиперлинк на страницу + описание краткое, уже минимум выполнен.

Но что именно и как тут заменить на флаги ?

Чувствую что истина где-то совсем рядом :) мне бы увидеть небольшой пример реального кода чтобы дошло окончательно...уверен что не только мне такое интересно.
Статей про сам индекс гораздо больше чем про описания КАК выводить результат используя те же флаги конфига...тем более не коннектясь к 10 БД одновременно.
Даже немножечко, чайная ложечка Улыбается это уже хорошо !
Заранее признателен !

  illusive

19.04.12 22:50:33

Почитайте, пожалуйста, про атрибуты Сфинкса: http://sphinxsearch.com/docs/2.0.4/attributes.html

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


Сортировку/ранжирование/режимы поиска можно решить с помощью Sphinx:
http://sphinxsearch.com/docs/2.0.4/sorting-modes.html 
http://sphinxsearch.com/docs/2.0.4/extended-syntax.html 
http://sphinxsearch.com/docs/2.0.4/matching-modes.html 
http://sphinxsearch.com/docs/2.0.4/weighting.html 
 

Успехов Улыбается 

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

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2011 Web-Blog Кисточка и фантазия: Зелинский Богдан