This is an old revision of the document!
Table of Contents
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
Все.
Sphinx settings
Sphinx Search Index основной индекс
Sphinx Delta Index - дельта индекс
Sphinx Search Log Index
Sphinx Search Mod for advanced user only, do not change if you are not sure Sphinx Ranker Mod for advanced user only, do not change if you are not sure Sphinx Max Matches for advanced user only, do not change if you are not sure default 20000
Sphinx for child (slave) sites
По дефолту слейв подхватывает данные сфинкса из базы мастера. те прописав сфинкс на мастере - все слейвы начинают так же юзать сфинкс.
Тут у вас может получиться следующий момент: по дефолту все пишут хост для сфинкса - localhost. Если слейв выносится на другой сервак - то логично что локалхост для него не работает в этом случае. Опять же логично что для этого случая надо прописать не локалхост, а конкретный ИП сервака где находится сфинк. И сразу проверить что коннекты разрешены на этот порт на этом серваке с того сервака, где стоит слейв.
Sphinx Search CTR
Если вы используете поиск сфинкс то по дефолту он ищет по релевантности (domain/?search=…
Можно так же сортировать результаты поиска по дате (domain/?search=…&order=date) и продолжительности (domain/?search=…&order=duration).
Sphinx settings
Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, хорошей идее добавить в конфиг эти необязательные строки.
min_word_len = 3 # Минимальная длина индексируемого слова min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе) enable_star = 1 # Использовать оператор усечения "*"
Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя.
