User Tools

Site Tools


ru:new_rotation_sphinx

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ru:new_rotation_sphinx [2019/10/30 09:02]
admin [Sphinx settings]
ru:new_rotation_sphinx [2020/02/16 16:15] (current)
admin [Search Log]
Line 1: Line 1:
 +====== 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
 +  * Запустить индексирование базы (так же делает админ)<code> indexer --all --rotate </code> 
 +  * вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа.
 +
 +Все.
 +
 +
 +Надо периодически запускать индексирование базы:
 +<code>
 +indexer --all --rotate
 +</code>
 +
 +
 +===== 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'
 +
 +
 +Теперь надо добавить создание дельта индекса
 +
 +<code>
 +
 +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
 +}
 +
 +
 +</code>
 +
 +
 +Как можно заметить запрос такой же, отличается только наличием в выборке по sphinx_max_gallery_id.
 +
 +После этого надо доабвить в крон индексацию новых записей так часто, как вам нравится строкой 
 +
 +  indexer --rotate delta
 +
 +После создания индекса надо прописать delta в Sphinx Delta Index  настройках ротации.
 +
 +и раз в сутки например можно присоединять дельта индекс к основному
 +
 +  indexer --rotate --merge your_name_index delta
 +
 +
 +Все.
 +
 +
 +
 +===== Search Log =====
 +
 +Когда пользователь ищет что-то на сайте (domain.com/?search=...) то этот запрос пишется в базу, что б потом можно было вывести лог запросов. Через какое-то время запросов может быть много плюс иногда полезно организовать морфологический поиск среди них. Для чего эти запросы так же можно индексировать сфинксом. 
 +
 +Для этого добавляем в конфиг сфинкса 
 +
 +<code>
 +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
 +}
 +
 +
 +</code>
 +
 +
 +и прописываем в сетингах Sphinx Search Log Index. Теперь этот индекс будет использован для выборки например похожих запросов для поиска, например у вас запрос domain.com/?search=..., вы выводите галеры по этому кейворду, а так же можно добавить список похожих поисков <thumb search_log=all filter=GET_search, вот для этой выборки и будет использован сфинкс, что будет быстрее и с использованием морфологии.
 +
 +
 +При этом так же нельзя забывать про реиндексацию. например, у нас был поиск "вася", дал 10 реузльтатов и лучшая галера там ИД 123. в базе ИД этой записи например 789 (ИД лучшщей галеры и ИД записи результатов поиска - это разные ИД). Сфинкс возвращает только ИД, в данном случае 789. И вот прошло какое-то время, поискали мы вася и оно вернуло уже другой результат, в базу его записало с ИД 888. А в реиндекса в сфинксе не было. И онвернул старый ид 789, которого уже нет. Или например который сейчас выдает какой-то другой результат, но в любом случае не актуальный.
 +===== 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 и выбрать параметры для себя.
 +
 +
 +===== Sphinx Reindex =====
 +
 +Об этом написано выше, но стоит повторить. Сфинкс - это не магия, он ищет по своему индексу. Свой индекс у него получается когда он проводит индксацию вашей базы. Если вы изменили базу (добавили галер, удалили и тп), а реиндексацию сфинкса не запустили - сфинкс про это не узнает.
 +
 +Это значит, что надо периодически проводоить реиндексацию. лучший вариант: смотреть когда у вас минимальная нагрузка и запускать индексацию в это время по крону.
 +===== Mysql Search =====
 +
 +По дефолту для поиска используется конструкция примерно WHERE description LIKE '%search_term%'. В настройках ротации есть пункт 
 +
 +Search fields
 +If you don't use Sphinx the script will use Mysql
 +built-in functionality. It's slower so we limit amount of fields
 +Please, read the last WIKI about the last option. 
 +
 +
 +По дефолту скрипт ищет по в description, в этом пункте можно настроить поиск в Title (Alt), либо по обоим полям сразу, что конечно создает несколько больше нагрузки.
 +
 +Лучший вариант - это настройка Sphinx о чем рассказано ниже.
 +
 +Но есть компромисный вариант: FullText Search для Mysql (последний из пунктов опции Search fields). Его смысл в том, что Mysql так же умеет искать учитывая морфологию, однако до версии 5.6 он это делал только для таблиц MyISAM.
 +
 +Итого если вы хотите использовать этот вариант, который несоклько проще варианта Sphinx в настройке надо для таблиц rot_gallery_data* добавить индекс 
 +
 +<code>
 +        ALTER TABLE `rot_gallery_data1` ADD FULLTEXT (
 + `alt` ,
 + `description`
 + )
 +</code>
 +
 +И переключить в настройках опцию на поиск FullText.
 +
 +