User Tools

Site Tools


Writing /home/user/smartcj.com/wiki/data/cache/5/5e535036771d5bdb55c48e4269aa842d.i failed
Unable to save cache file. Hint: disk full; file permissions; safe_mode setting.
Writing /home/user/smartcj.com/wiki/data/cache/5/5e535036771d5bdb55c48e4269aa842d.metadata failed
ru:new_rotation_sphinx

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ru:new_rotation_sphinx [2019/06/11 08:34] – [Sphinx for Rotation\Tube sites] adminru:new_rotation_sphinx [2025/05/05 16:30] (current) – [Mysql Search] admin
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, вот для этой выборки и будет использован сфинкс, что будет быстрее и с использованием морфологии.
 +
 +
 +При этом так же нельзя забывать про реиндексацию. например, у нас был поиск "вася", дал 10 реузльтатов и лучшая галера там ИД 123. в базе ИД этой записи например 789 (ИД лучшщей галеры и ИД записи результатов поиска - это разные ИД). Сфинкс возвращает только ИД, в данном случае 789. И вот прошло какое-то время, поискали мы вася и оно вернуло уже другой результат, в базу его записало с ИД 888. А в реиндекса в сфинксе не было. И онвернул старый ид 789, которого уже нет. Или например который сейчас выдает какой-то другой результат, но в любом случае не актуальный.
 ===== Sphinx settings ===== ===== Sphinx settings =====
  
 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: by admin