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