SlideShare a Scribd company logo
Sphinx
Система полнотекстового поиска,
разработанная Андреем Аксеновым и
распространяемая по лицензии GNU GPL.
Sphinx
Отличительной особенностью является
высокая скорость индексации и поиска, а
также интеграция с существующими СУБД
(MySQL, PostgreSQL) и API для
распространённых языков веб-
программирования.
• Хабрахабр
• Викимапия
• Пиратская бухта
• CMS LiveStreet
• Ski.ru
• пр.
Sphinx
Зачем?
• Морфологический поиск
• Различные источники поиска
• Скорость
• Встроенные возможности для сниппетов
• Простой язык запросов (*,|,&,! и пр.)
• Плюшки типа MVA,wordforms, stopwords
• бесплатно
Принцип работы
• Медленно индексируем источники данных
• Быстро выполняем по ним поиск
• PROFIT
Установка
• http://sphinxsearch.com/downloads/release/
• Исходники, инсталяторы для винды, пакеты
для Ubuntu, RHEL, CentOS
• В репозитариях не нашел .(
• rpm –ihv пакет.rpm
• Или
• ./configure, make, make install
• chkconfig sphinx on
Конфиг коннекта
#/usr/local/etc/sphinx.conf – конфиг тут
source parent
{
type = mysql #mysql, pgsql, mssql, xmlpipe and xmlpipe2, and odbc.
sql_host = 127.0.0.1
sql_user = db_user
sql_pass = db_pass
sql_db = db_name
sql_port = 3306
# Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы
# операции с БД происходили не через TCP/IP стек сервера)
sql_sock = /var/lib/mysql/mysql.sock
#mysql_connect_flags = 32 # 32- включение сжатие при обмене данными с БД
# Включам нужную кодировку соединения и выключаем кеш запросов
sql_query_pre = SET NAMES cp1251
#sql_query_pre = SET SESSION query_cache_type=OFF
sql_ranged_throttle = 500 #пауза в м.сек. между запросами
}
Каталог статей. Часть 1
source documents: parent
{
# запрос на получения данных топиков
sql_query = SELECT 100000 + documents.id as
`fake_id`, documents.title as `title`,
documents.body as `text`, 1 as `type`,
documents.id as `id`, documents. pub_date,
documents. user as `user` FROM documents
WHERE documents.id BETWEEN $start AND $end
Каталог статей. Часть 2
# запрос для дробления получения топиков
#на неколько итераций
sql_query_range = SELECT
MIN(documents.id),MAX(documents.id)
FROM documents
Каталог статей. Часть 3
# сколько получать объектов за итерацию
sql_range_step = 1000
#неиндексируемые данные
sql_attr_uint = type
sql_attr_uint = id
sql_attr_timestamp = pub_date
}
Блоги. Часть 1
source blogs: parent
{
sql_query = SELECT 200000 + posts.id as `fake_id`,
posts.title, posts.text, 2 as `type`, az_posts.id,
posts.pub_date , users.name as `user`
FROM posts
INNER JOIN `users` ON users.id = posts.user_id
WHERE posts.id BETWEEN $start AND $end
Блоги. Часть 2
# запрос для дробления получения топиков
# на неколько итераций
sql_query_range = SELECT MIN(id),MAX(id) FROM posts
# сколько получать объектов за итерацию
sql_range_step = 1000
sql_attr_uint = type
sql_attr_uint = id
sql_attr_timestamp = pub_date
}
Конфиг индекса
index site_search
{
source = posts
source = documents
path = /vhosts/site.ru/sphinx/site_search
docinfo = extern
morphology = stem_en, stem_ru
html_strip = 1
charset_type = sbcs #для однобайтных кодировок
min_word_len = 2 #мин длина фразы для поиска
# Минимальная длина инфикса (префикс в том числе)
#min_infix_len = 2
#enable_star = 1
}
Конфиг индексатора и демона
indexer
{
# Лимит памяти, который может использавать демон-индексатор
mem_limit = 256M
}
searchd
{
listen = 127.0.0.1 # Адрес, на котором будет прослушиваться порт
port = 3312 # Ну и собственно номер порта демона searchd
log = /var/log/sphinx/searchd.log # Лог-файл демона
# Лог поисковых запросов.
query_log = /var/log/sphinx/query.log
# Время в секундах, которое ждет демон при обмене данными с клиентом
read_timeout = 5
# Максимальное количество одновременно-обрабатываемых запросов
#. 0 означает дофига, а точнее без ограничения
max_children = 30
# Файл, в который сохраняется PID-процесса при запуске
pid_file = /var/log/sphinx/searchd.pid
max_matches = 250
}
Запуск
Запуск демона:
service searchd start
Запуск индексатора:
indexer --all --rotate
Крон:
37 */4 * * * indexer --all –rotate
Запускать можно не от рута:
в /etc/init.d/sphinx нужно указать юзера
крон, файлы логов ,файл с pid, файл конфига и директория для
файлов индекса должны иметь соответствующие права
Варианты взаимодействия
• SphinxSE
• SphinxQL
•Sphinx API
Подключение API и настройка
require_once ’Sphinxapi.php’;
$cl = new SphinxClient();
$cl->SetServer("localhost",3312);
$cl->SetFieldWeights(array (
'title' => 20,
'user' => 15,
'text' => 10,
));
Настройка
//рассказать про SPH_MATCH_EXTENDED
//и SPH_MATCH_ALL
$cl->SetMatchMode(SPH_MATCH_ANY);
if($_GET[‘filter’])
$cl->SetFilter('type', array($_GET[‘filter’]));
//рассказать еще про SPH_SORT_RELEVANCE
//и SPH_SORT_EXPR
$cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC,
p_date DESC');
$cl->SetLimits(0, 20, 250);
Получение результатов
$result = $cl->Query($_GET[‘query’],’site_search’);
foreach($result["matches"] as $doc => $docinfo)
{
switch($docinfo['attrs']['type'])
{
case ‘1’:
$sql = “SELECT * FROM `documents`”;
$sql .= “ WHERE `id` = ‘”. $docinfo[‘attrs’][‘id’]
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
$title = $row['title'];
$text = $row['text'];
$url = $row[‘url'];
break;
case ‘2’:
//тоже самое, но запрос в другую таблицу
}
Сниппеты
$params_text = array
(
"before_match" => "<b>",
"after_match" => "</b>",
"chunk_separator" => " ... ",
"limit" => 256,
"around" => 5
);
list($snippet) = $cl->BuildExcerpts(array($text),
‘site_search’,$_GET[‘query’], $params_text);
Вывод
echo $title.”<BR>”;
echo $snippet.”<BR>”;
echo $user.”<BR>”;
echo $url.”<BR><BR>”;
} //end foreach
Что можно добавить?
• Поиск по ключевикам для лучшего
ранжирования
• Подсказки при добавлении тегов с
синонимами
• Фильтр по тегам при поиске(используя
MVA)
• Фильтр по датам
Ссылки
http://sphinxsearch.com/docs/current.html
http://habrahabr.ru/hub/sphinx/posts/
яндекс, гугл
Аплодисменты
Пофлудим?

More Related Content

What's hot

Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
Dmitry Viskov
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
DevDay
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
0leGG
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюГлеб Тарасов
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
mcroitor
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Tanya Denisyuk
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Yandex
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Глеб Тарасов
 
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014kamazee
 
Authentication security
Authentication securityAuthentication security
Authentication security
Olga Lavrentieva
 
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядомQA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
QAFest
 
Pagination MongoDb
Pagination MongoDbPagination MongoDb
Pagination MongoDb
Airat Khisamov
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
Ilya Chesnokov
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
SmartTools
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
Positive Hack Days
 

What's hot (20)

Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Avito / SPA Meetup 2
 
My sql 1
My sql 1My sql 1
My sql 1
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
 
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
 
диплом
дипломдиплом
диплом
 
Authentication security
Authentication securityAuthentication security
Authentication security
 
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядомQA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
QA Fest 2014. Катерина Овеченко. Google hacking: удивительное рядом
 
Pagination MongoDb
Pagination MongoDbPagination MongoDb
Pagination MongoDb
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 

Similar to Sphinx

#MBLTdev: Знакомство с codesign (e-Legion)
#MBLTdev: Знакомство с codesign (e-Legion)#MBLTdev: Знакомство с codesign (e-Legion)
#MBLTdev: Знакомство с codesign (e-Legion)
e-Legion
 
Sphinx: распределяя индексы.
Sphinx: распределяя индексы.Sphinx: распределяя индексы.
Sphinx: распределяя индексы.
MageCloud
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
DevOps или исскуство ухода за Интернет-проектом
DevOps или исскуство ухода за Интернет-проектомDevOps или исскуство ухода за Интернет-проектом
DevOps или исскуство ухода за Интернет-проектом
Alexander Titov
 
Web осень 2012 лекция 11
Web осень 2012 лекция 11Web осень 2012 лекция 11
Web осень 2012 лекция 11Technopark
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Devconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииDevconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииAlex Popov
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42
DevDay
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковFuenteovejuna
 
Setup1
Setup1Setup1
Setup1
Zuenta
 
HSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработкиHSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработки
Business incubator HSE
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проекта
Python Meetup
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
11 лекция, петр волков
11 лекция, петр волков11 лекция, петр волков
11 лекция, петр волков
karina krew
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
 

Similar to Sphinx (20)

#MBLTdev: Знакомство с codesign (e-Legion)
#MBLTdev: Знакомство с codesign (e-Legion)#MBLTdev: Знакомство с codesign (e-Legion)
#MBLTdev: Знакомство с codesign (e-Legion)
 
Sphinx: распределяя индексы.
Sphinx: распределяя индексы.Sphinx: распределяя индексы.
Sphinx: распределяя индексы.
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
PHP
PHPPHP
PHP
 
DevOps или исскуство ухода за Интернет-проектом
DevOps или исскуство ухода за Интернет-проектомDevOps или исскуство ухода за Интернет-проектом
DevOps или исскуство ухода за Интернет-проектом
 
Web осень 2012 лекция 11
Web осень 2012 лекция 11Web осень 2012 лекция 11
Web осень 2012 лекция 11
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Devconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логированииDevconf 2014 Трассировка событий при логировании
Devconf 2014 Трассировка событий при логировании
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42«DevOps — это о передаче смысла» — Александр Титов, Express 42
«DevOps — это о передаче смысла» — Александр Титов, Express 42
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
 
Setup1
Setup1Setup1
Setup1
 
HSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработкиHSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработки
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проекта
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
11 лекция, петр волков
11 лекция, петр волков11 лекция, петр волков
11 лекция, петр волков
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 

Sphinx

  • 1. Sphinx Система полнотекстового поиска, разработанная Андреем Аксеновым и распространяемая по лицензии GNU GPL.
  • 2. Sphinx Отличительной особенностью является высокая скорость индексации и поиска, а также интеграция с существующими СУБД (MySQL, PostgreSQL) и API для распространённых языков веб- программирования.
  • 3. • Хабрахабр • Викимапия • Пиратская бухта • CMS LiveStreet • Ski.ru • пр. Sphinx
  • 4. Зачем? • Морфологический поиск • Различные источники поиска • Скорость • Встроенные возможности для сниппетов • Простой язык запросов (*,|,&,! и пр.) • Плюшки типа MVA,wordforms, stopwords • бесплатно
  • 5. Принцип работы • Медленно индексируем источники данных • Быстро выполняем по ним поиск • PROFIT
  • 6. Установка • http://sphinxsearch.com/downloads/release/ • Исходники, инсталяторы для винды, пакеты для Ubuntu, RHEL, CentOS • В репозитариях не нашел .( • rpm –ihv пакет.rpm • Или • ./configure, make, make install • chkconfig sphinx on
  • 7. Конфиг коннекта #/usr/local/etc/sphinx.conf – конфиг тут source parent { type = mysql #mysql, pgsql, mssql, xmlpipe and xmlpipe2, and odbc. sql_host = 127.0.0.1 sql_user = db_user sql_pass = db_pass sql_db = db_name sql_port = 3306 # Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы # операции с БД происходили не через TCP/IP стек сервера) sql_sock = /var/lib/mysql/mysql.sock #mysql_connect_flags = 32 # 32- включение сжатие при обмене данными с БД # Включам нужную кодировку соединения и выключаем кеш запросов sql_query_pre = SET NAMES cp1251 #sql_query_pre = SET SESSION query_cache_type=OFF sql_ranged_throttle = 500 #пауза в м.сек. между запросами }
  • 8. Каталог статей. Часть 1 source documents: parent { # запрос на получения данных топиков sql_query = SELECT 100000 + documents.id as `fake_id`, documents.title as `title`, documents.body as `text`, 1 as `type`, documents.id as `id`, documents. pub_date, documents. user as `user` FROM documents WHERE documents.id BETWEEN $start AND $end
  • 9. Каталог статей. Часть 2 # запрос для дробления получения топиков #на неколько итераций sql_query_range = SELECT MIN(documents.id),MAX(documents.id) FROM documents
  • 10. Каталог статей. Часть 3 # сколько получать объектов за итерацию sql_range_step = 1000 #неиндексируемые данные sql_attr_uint = type sql_attr_uint = id sql_attr_timestamp = pub_date }
  • 11. Блоги. Часть 1 source blogs: parent { sql_query = SELECT 200000 + posts.id as `fake_id`, posts.title, posts.text, 2 as `type`, az_posts.id, posts.pub_date , users.name as `user` FROM posts INNER JOIN `users` ON users.id = posts.user_id WHERE posts.id BETWEEN $start AND $end
  • 12. Блоги. Часть 2 # запрос для дробления получения топиков # на неколько итераций sql_query_range = SELECT MIN(id),MAX(id) FROM posts # сколько получать объектов за итерацию sql_range_step = 1000 sql_attr_uint = type sql_attr_uint = id sql_attr_timestamp = pub_date }
  • 13. Конфиг индекса index site_search { source = posts source = documents path = /vhosts/site.ru/sphinx/site_search docinfo = extern morphology = stem_en, stem_ru html_strip = 1 charset_type = sbcs #для однобайтных кодировок min_word_len = 2 #мин длина фразы для поиска # Минимальная длина инфикса (префикс в том числе) #min_infix_len = 2 #enable_star = 1 }
  • 14. Конфиг индексатора и демона indexer { # Лимит памяти, который может использавать демон-индексатор mem_limit = 256M } searchd { listen = 127.0.0.1 # Адрес, на котором будет прослушиваться порт port = 3312 # Ну и собственно номер порта демона searchd log = /var/log/sphinx/searchd.log # Лог-файл демона # Лог поисковых запросов. query_log = /var/log/sphinx/query.log # Время в секундах, которое ждет демон при обмене данными с клиентом read_timeout = 5 # Максимальное количество одновременно-обрабатываемых запросов #. 0 означает дофига, а точнее без ограничения max_children = 30 # Файл, в который сохраняется PID-процесса при запуске pid_file = /var/log/sphinx/searchd.pid max_matches = 250 }
  • 15. Запуск Запуск демона: service searchd start Запуск индексатора: indexer --all --rotate Крон: 37 */4 * * * indexer --all –rotate Запускать можно не от рута: в /etc/init.d/sphinx нужно указать юзера крон, файлы логов ,файл с pid, файл конфига и директория для файлов индекса должны иметь соответствующие права
  • 17. Подключение API и настройка require_once ’Sphinxapi.php’; $cl = new SphinxClient(); $cl->SetServer("localhost",3312); $cl->SetFieldWeights(array ( 'title' => 20, 'user' => 15, 'text' => 10, ));
  • 18. Настройка //рассказать про SPH_MATCH_EXTENDED //и SPH_MATCH_ALL $cl->SetMatchMode(SPH_MATCH_ANY); if($_GET[‘filter’]) $cl->SetFilter('type', array($_GET[‘filter’])); //рассказать еще про SPH_SORT_RELEVANCE //и SPH_SORT_EXPR $cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC, p_date DESC'); $cl->SetLimits(0, 20, 250);
  • 19. Получение результатов $result = $cl->Query($_GET[‘query’],’site_search’); foreach($result["matches"] as $doc => $docinfo) { switch($docinfo['attrs']['type']) { case ‘1’: $sql = “SELECT * FROM `documents`”; $sql .= “ WHERE `id` = ‘”. $docinfo[‘attrs’][‘id’] $result = mysql_query($sql); $row = mysql_fetch_assoc($result); $title = $row['title']; $text = $row['text']; $url = $row[‘url']; break; case ‘2’: //тоже самое, но запрос в другую таблицу }
  • 20. Сниппеты $params_text = array ( "before_match" => "<b>", "after_match" => "</b>", "chunk_separator" => " ... ", "limit" => 256, "around" => 5 ); list($snippet) = $cl->BuildExcerpts(array($text), ‘site_search’,$_GET[‘query’], $params_text);
  • 21. Вывод echo $title.”<BR>”; echo $snippet.”<BR>”; echo $user.”<BR>”; echo $url.”<BR><BR>”; } //end foreach
  • 22. Что можно добавить? • Поиск по ключевикам для лучшего ранжирования • Подсказки при добавлении тегов с синонимами • Фильтр по тегам при поиске(используя MVA) • Фильтр по датам