User Tools

Site Tools

Translations of this page:

ru:new_rotation_sphinx

Sphinx for Rotation\Tube sites

Когда ваша база разрастается до приличного размера, скажем больше 50 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 (так же обычно делает админ). Пример конфига:
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 
  • вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа.

Все.

Надо периодически запускать индексирование базы:

indexer --all --rotate

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).

В 50 добавился еще вариант сортировки результатов по ctr (domain/?search=…&order=ctr)

Sphinx settings

Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, хорошей идее добавить в конфиг эти необязательные строки.

min_word_len = 3 # Минимальная длина индексируемого слова
min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе)
enable_star = 1 # Использовать оператор усечения "*"

Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя.

ru/new_rotation_sphinx.txt · Last modified: 2019/06/11 08:34 by admin