This is an old revision of the document!
Table of Contents
Sphinx for Rotation\Tube sites
Когда ваша база разрастается до приличного размера, скажем больше 50 000 галер, скорость поиска стандартным средствами mysql заметно падает.
Sphinx это система быстрого поиска с учетом морфологии. Более того, имеет смысл внедрять ее и до достижения вашей базой приличного размера из-за преищуществ морфологического поиска.
Установка:
- Попросить админа поставить сам sphinx
- создать каталог scj/sphinx
- Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). Пример конфига:
source scj
{
type = mysql
sql_host = localhost
sql_user = scj_mysql_login
sql_pass = scj_mysql_password
sql_db = scj_db
sql_port = 3306 # optional, default is 3306
// ====== version 48
sql_query = SELECT id, date, tags, alt, description, duration, sponsor_id, rgroup FROM rot_galleries as g \
JOIN rot_gallery_stats AS gs ON g.id = gs.thumb_id WHERE status = 1 and gs.best_thumb = 'yes' and rgroup != 0
sql_attr_timestamp = date
sql_attr_uint = duration
sql_attr_uint = sponsor_id
sql_attr_uint = rgroup
// ================= version 49
sql_query = SELECT id, UNIX_TIMESTAMP(activation_date) as date, tags, alt, description, duration, sponsor_id, rgroup FROM rot_galleries as g \
JOIN rot_gallery_stats AS gs ON g.id = gs.thumb_id JOIN rot_gallery_data AS gd ON gd.gallery_md5 = g.gallery_md5 WHERE status = 1 and gs.best_thumb = 'yes' and rgroup != 0
sql_attr_timestamp = date
sql_attr_uint = duration
sql_attr_uint = sponsor_id
sql_attr_uint = rgroup
// ================= version 50
sql_query = SELECT id, crc32(g.gallery_md5) as gallery_md5_crc, UNIX_TIMESTAMP(activation_date) as date, tags, alt, description, duration, sponsor_id, rgroup, content_type, gs.total_ctr FROM rot_galleries as g \
JOIN rot_gallery_stats AS gs ON g.id = gs.thumb_id \
JOIN rot_gallery_info AS gi ON g.gallery_md5 = gi.gallery_md5 \
JOIN rot_gallery_data AS gd ON g.gallery_md5 = gd.gallery_md5 \
WHERE status = 1 and gs.best_thumb = 'yes' and rgroup != 0
sql_attr_timestamp = date
sql_attr_uint = duration
sql_attr_uint = sponsor_id
sql_attr_uint = rgroup
sql_attr_float = total_ctr
sql_attr_uint = content_type
sql_attr_uint = gallery_md5_crc
// ================= version 51
sql_query = SELECT id, crc32(g.gallery_md5) as gallery_md5_crc, UNIX_TIMESTAMP(activation_date) as date, tags, alt, description, duration, sponsor_id, rgroup, gs.total_ctr, \
g.content_type, (SELECT group_concat(group_id) FROM rot_gal2group as g2gr WHERE g2gr.gal_id = g.id) as categories FROM rot_galleries as g JOIN rot_gallery_stats AS gs ON g.id = gs.thumb_id \
JOIN rot_gallery_info AS gi ON g.gallery_md5 = gi.gallery_md5 \
JOIN rot_gallery_data AS gd ON g.gallery_md5 = gd.gallery_md5 \
WHERE status = 1 and gs.best_thumb = 'yes' and rgroup != 0 and gs.group_id = 0
sql_attr_timestamp = date
sql_attr_uint = duration
sql_attr_uint = sponsor_id
sql_attr_uint = rgroup
sql_attr_float = total_ctr
sql_attr_uint = content_type
sql_attr_uint = gallery_md5_crc
sql_attr_multi = uint categories from field;
sql_query_info = SELECT * FROM rot_galleries WHERE id=$id
}
index scj_index
{
source = scj
path = /path_to_data/scj/sphinx/scj_index
docinfo = extern
morphology = stem_en # or stem_ru for example
}
Тут надо заменить:
scj_mysql_login
scj_mysql_password
scj_db
path_to_data
- Запустить индексирование базы (так же делает админ)
indexer --all --rotate
- вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа.
Все.
NOTE Небольшое отступление про Sphinx. Его можно представить как урезанную версию вашей mysql базы. В mysql базе содержится информация условно id - дата добавления - описания - тумбы и тд.
Sphinx условно делает “выжимку” из базы в виде id - кейворды. Поиск по такой базе намного быстрее (к тому же сама структура Sphinx оптимизированна именно для поиска)
Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД, и скрипт едлает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу.
Для этого надо периодически запускать индексирование базы:
indexer --all --rotate
Sphinx for child (slave) sites
По дефолту слейв подхватывает данные сфинкса из базы мастера. те прописав сфинкс на мастере - все слейвы начинают так же юзать сфинкс.
Тут у вас может получиться следующий момент: по дефолту все пишут хост для сфинкса - localhost. Если слейв выносится на другой сервак - то логично что локалхост для него не работает в этом случае. Опять же логично что для этого случая надо прописать не локалхост, а конкретный ИП сервака где находится сфинк. И сразу проверить что коннекты разрешены на этот порт на этом серваке с того сервака, где стоит слейв.
Sphinx Search CTR
Если вы используете поиск сфинкс то по дефолту он ищет по релевантности (domain/?search=…
Можно так же сортировать результаты поиска по дате (domain/?search=…&order=date) и продолжительности (domain/?search=…&order=duration).
В 50 добавился еще вариант сортировки результатов по ctr (domain/?search=…&order=ctr)
Sphinx settings
Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, хорошей идее добавить в конфиг эти необязательные строки.
min_word_len = 3 # Минимальная длина индексируемого слова min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе) enable_star = 1 # Использовать оператор усечения "*"
Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя.
