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/06/11 08:34]
admin [Sphinx for Rotation\Tube sites]
ru:new_rotation_sphinx [2019/10/30 09:02] (current)
admin [Sphinx settings]
Line 1: Line 1:
 ====== Sphinx for Rotation\Tube sites ====== ====== Sphinx for Rotation\Tube sites ======
  
-Когда ваша база разрастается до приличного размера,​ скажем больше ​50 000 галер, скорость поиска стандартным+Когда ваша база разрастается до приличного размера,​ скажем больше ​100 000 галер, скорость поиска стандартным
  ​средствами mysql заметно падает.  ​средствами mysql заметно падает.
  
Line 8: Line 8:
 Sphinx условно делает "​выжимку"​ из базы в виде id - кейворды. Поиск по такой базе намного быстрее (к тому же сама структура Sphinx оптимизированна именно для поиска) Sphinx условно делает "​выжимку"​ из базы в виде id - кейворды. Поиск по такой базе намного быстрее (к тому же сама структура Sphinx оптимизированна именно для поиска)
  
-Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД, и скрипт делает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу. ​+Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД галер, и скрипт делает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу. ​
  
 Как работает сфинкс:​ он проходит по всей базе и составляет на ее основе свой индекс (Sphinx Search Index ), по которому умеет искать быстро и хорошо. Из чего следует что периодически этот индекс надо обновлять. Если в базе были изменения они появяться в Sphinx Search Index только после переиндексации. Как работает сфинкс:​ он проходит по всей базе и составляет на ее основе свой индекс (Sphinx Search Index ), по которому умеет искать быстро и хорошо. Из чего следует что периодически этот индекс надо обновлять. Если в базе были изменения они появяться в Sphinx Search Index только после переиндексации.
Line 28: Line 28:
   * Попросить админа поставить сам sphinx ​   * Попросить админа поставить сам sphinx ​
   * создать каталог scj/sphinx   * создать каталог scj/sphinx
-  * Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). ​Пример конфига:+  * Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). ​Сам конфиг находится в Rotation Settings - site search 
 +  * Запустить индексирование базы (так же делает админ)<​code>​ indexer --all --rotate </​code>​  
 +  * вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа.
  
 +Все.
 +
 +
 +Надо периодически запускать индексирование базы:
 <​code>​ <​code>​
-source scj +indexer --all --rotate 
-+</​code>​
- 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+===== Sphinx Delta Config ​=====
  
- sql_query = SELECT iddatetags, alt, description,​ duration, sponsor_id, rgroup FROM rot_galleries as g \ +При создании индекса sphinx делает индекс текущего состояния базы и если после индексирования в базе были какие-либо изменениято  sphinx не найдет новых данныхтк они были добавлены после индексирования.
-  ​ 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+
  
 +Что бы решить эту проблему придумали delta index – это индекс в который попадут измения,​ которые произошли с момента полной индексации и до момента создания дельта индекса. При этом, поскольку индексируется малое кол-во данных,​ операция проходит очень быстро.
  
 +При поиска sphinx будет искать и в основном индексе и в дельта индексе,​ и таким образом будет видеть все измения. Создание дельта индекса можно поставить как угодно часто.
  
-//   ​================= ​ 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_pre = SET NAMES utf8
  
-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_query_pre ​UPDATE rot_settings SET value (SELECT MAX(gallery_id) FROM rot_gallery_info) WHERE name '​sphinx_max_gallery_id'​
- 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,​ \ +<​code>​
-  ​ 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; ​+
  
 +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,​ \
 +  ​                                                                \
  
- sql_query_info  ​       ​= SELECT ​FROM rot_galleries ​WHERE id=$id+ (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 ​
 +    ​
 } }
  
  
-index scj_index+index delta : your_name_index
 { {
- source scj +    ​source = delta 
- path = /path_to_data/scj/sphinx/​scj_index +    path = /your_full_path/data/delta
- docinfo = extern +
- morphology ​                             = stem_en # or stem_ru for example+
 } }
  
-Тут надо заменить:​ 
  
-scj_mysql_login 
-scj_mysql_password 
-scj_db 
-path_to_data 
 </​code>​ </​code>​
  
-  * Запустить ​индексирование ​базы (так ​же делает админ)<​code> ​indexer ​--all --rotate ​</​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>​ <​code>​
-indexer --all --rotate+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>​ </​code>​
 +
 +
 +и прописываем в сетингах Sphinx Search Log Index. Теперь этот индекс будет использован для выборки например похожих запросов для поиска,​ например у вас запрос domain.com/?​search=...,​ вы выводите галеры по этому кейворду,​ а так же можно добавить список похожих поисков <thumb search_log=all filter=GET_search,​ вот для этой выборки и будет использован сфинкс,​ что будет быстрее и с использованием морфологии.
 +
  
  
Line 135: Line 168:
 Sphinx Search Index основной индекс Sphinx Search Index основной индекс
  
-Sphinx Delta Index - дельта индекс, загуглите что такое дельта+Sphinx Delta Index - дельта индекс
  
 Sphinx Search Log Index Sphinx Search Log Index
Line 163: Line 196:
  
 Можно так же сортировать результаты поиска по дате (domain/?​search=...&​order=date) и продолжительности (domain/?​search=...&​order=duration). Можно так же сортировать результаты поиска по дате (domain/?​search=...&​order=date) и продолжительности (domain/?​search=...&​order=duration).
- 
-В 50 добавился еще вариант сортировки результатов по ctr (domain/?​search=...&​order=ctr) 
  
  
Line 177: Line 208:
  
 Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя. Но конечно лучше всего пройтись по документации 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.
 +
 +
 +
ru/new_rotation_sphinx.1560242078.txt.gz · Last modified: 2019/06/11 08:34 by admin