====== Sphinx for Rotation\Tube sites ======
Когда ваша база разрастается до приличного размера, скажем больше 100 000 галер, скорость поиска стандартным
средствами mysql заметно падает.
Sphinx это система быстрого поиска с учетом морфологии. Более того, имеет смысл внедрять ее и до достижения вашей базой приличного размера из-за преищуществ морфологического поиска.
Sphinx условно делает "выжимку" из базы в виде id - кейворды. Поиск по такой базе намного быстрее (к тому же сама структура Sphinx оптимизированна именно для поиска)
Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД галер, и скрипт делает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу.
Как работает сфинкс: он проходит по всей базе и составляет на ее основе свой индекс (Sphinx Search Index ), по которому умеет искать быстро и хорошо. Из чего следует что периодически этот индекс надо обновлять. Если в базе были изменения они появяться в Sphinx Search Index только после переиндексации.
На большой базе переиндексация может быть довольно тяжелым процессом поэтому добавляется Sphinx Delta Index, смысл которого что можно индексить только новые записи, что быстро, и потом периодически сливать воедино с Sphinx Search Index
Так же можно индекссиировать сфинксом лог поисковых запросов, что б пользоваться преимуществами сфинкса для поиска похожих запросов (Sphinx Search Log Index)
Сфинкс умеет по-разному искать (Sphinx Search Mod) и ранжировать результаты поиска (Sphinx Ranker Mod), в документации сфинкса полностью расписано какие они бывают и на что влияют.
При поиске очень общего слова может быть очень много результатов и огромная пагинация, в большинстве случаев это не надо и можно ограничить максимальное кол-во результатов поиска (Sphinx Max Matches)
===== Sphinx installation =====
* Попросить админа поставить сам sphinx
* создать каталог scj/sphinx
* Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). Сам конфиг находится в Rotation Settings - site search
* Запустить индексирование базы (так же делает админ) indexer --all --rotate
* вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа.
Все.
Надо периодически запускать индексирование базы:
indexer --all --rotate
===== Sphinx Delta Config =====
При создании индекса sphinx делает индекс текущего состояния базы и если после индексирования в базе были какие-либо изменения, то sphinx не найдет новых данных, тк они были добавлены после индексирования.
Логический вывод из этого: надо проводить реиндексацию после каждого изменения в базе, однако проблема в том, что если база достаточно большая то индексация может занимать длительное время. И индексация это очень затратный по ресурсам процесс.
Что бы решить эту проблему придумали delta index – это индекс в который попадут измения, которые произошли с момента полной индексации и до момента создания дельта индекса. При этом, поскольку индексируется малое кол-во данных, операция проходит очень быстро.
При поиска sphinx будет искать и в основном индексе и в дельта индексе, и таким образом будет видеть все измения. Создание дельта индекса можно поставить как угодно часто.
Итого :
в основную часть, которая у вас уже есть надо добавить после
sql_query_pre = SET NAMES utf8
строку
sql_query_pre = UPDATE rot_settings SET value = (SELECT MAX(gallery_id) FROM rot_gallery_info) WHERE name = 'sphinx_max_gallery_id'
Теперь надо добавить создание дельта индекса
source delta : your_name_source
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT gi.gallery_id, UNIX_TIMESTAMP(gi.activation_date) as date, alt, description, gi.duration, sponsor_id, gs.total_ctr, gi.content_type, \
(SELECT group_concat(tag_name) FROM rot_gal2tag g2t \
LEFT JOIN rot_tags as t on t.tag_id = g2t.tag_id \
WHERE g2t.gallery_id = gi.gallery_id) as tags, \
(SELECT group_concat(tag_id) FROM rot_gal2tag g2t \
WHERE g2t.gallery_id = gi.gallery_id) as tag_ids, \
(SELECT group_concat(name) FROM rot_groups \
WHERE rot_groups.id in (SELECT group_id FROM rot_gallery_stats1 WHERE rot_gallery_stats1.gallery_id = gi.gallery_id AND group_id != 0) ) as group_names, \
\
(SELECT group_concat(gss.group_id) FROM rot_gallery_stats1 as gss \
WHERE gss.gallery_id = gi.gallery_id AND group_id != 0) as categories \
FROM rot_gallery_info AS gi \
JOIN rot_gallery_data1 AS gd ON gi.gallery_id = gd.gallery_id \
JOIN rot_gallery_stats1 AS gs ON gs.gallery_id = gi.gallery_id \
WHERE gi.gallery_id > ( SELECT value FROM rot_settings WHERE name = 'sphinx_max_gallery_id' ) \
AND gallery_status = 'active' and gallery_type = 0 \
and gs.best_thumb = 'yes' and gs.group_id = 0
}
index delta : your_name_index
{
source = delta
path = /your_full_path/data/delta
}
Как можно заметить запрос такой же, отличается только наличием в выборке по sphinx_max_gallery_id.
После этого надо доабвить в крон индексацию новых записей так часто, как вам нравится строкой
indexer --rotate delta
После создания индекса надо прописать delta в Sphinx Delta Index настройках ротации.
и раз в сутки например можно присоединять дельта индекс к основному
indexer --rotate --merge your_name_index delta
Все.
===== Search Log =====
Когда пользователь ищет что-то на сайте (domain.com/?search=...) то этот запрос пишется в базу, что б потом можно было вывести лог запросов. Через какое-то время запросов может быть много плюс иногда полезно организовать морфологический поиск среди них. Для чего эти запросы так же можно индексировать сфинксом.
Для этого добавляем в конфиг сфинкса
source search_queries
{
type = mysql
sql_host = YOUR_HOST
sql_user = USERNAME
sql_pass = PASSWORD
sql_db = DB_NAME
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT sq_id, search_query, hits, items_found FROM rot_search_queries WHERE hits > 0 GROUP BY search_query
sql_attr_uint = hits
sql_attr_uint = items_found
}
index search_queries_index
{
source = search_queries
path = /WHERE_TO_STORE
docinfo = extern
morphology = stem_en
}
и прописываем в сетингах Sphinx Search Log Index. Теперь этот индекс будет использован для выборки например похожих запросов для поиска, например у вас запрос domain.com/?search=..., вы выводите галеры по этому кейворду, а так же можно добавить список похожих поисков
ALTER TABLE `rot_gallery_data1` ADD FULLTEXT (
`alt` ,
`description`
)
И переключить в настройках опцию на поиск FullText.