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.
| Next revision | Previous revision | ||
| ru:new_rotation_sphinx [2014/01/29 18:19] – external edit 127.0.0.1 | ru: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 ====== | ||
| - | Когда ваша база разрастается до приличного размера, | + | Когда ваша база разрастается до приличного размера, |
| | | ||
| Sphinx это система быстрого поиска с учетом морфологии. Более того, имеет смысл внедрять ее и до достижения вашей базой приличного размера из-за преищуществ морфологического поиска. | Sphinx это система быстрого поиска с учетом морфологии. Более того, имеет смысл внедрять ее и до достижения вашей базой приличного размера из-за преищуществ морфологического поиска. | ||
| - | Установка: | + | Sphinx условно делает " |
| + | |||
| + | Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД галер, и скрипт делает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу. | ||
| + | |||
| + | Как работает сфинкс: | ||
| + | |||
| + | На большой базе переиндексация может быть довольно тяжелым процессом поэтому добавляется Sphinx Delta Index, смысл которого что можно индексить только новые записи, | ||
| + | |||
| + | Так же можно индекссиировать сфинксом лог поисковых запросов, | ||
| + | |||
| + | |||
| + | Сфинкс умеет по-разному искать (Sphinx Search Mod) и ранжировать результаты поиска (Sphinx Ranker Mod), в документации сфинкса полностью расписано какие они бывают и на что влияют. | ||
| + | |||
| + | |||
| + | При поиске очень общего слова может быть очень много результатов и огромная пагинация, | ||
| + | |||
| + | |||
| + | |||
| + | ===== Sphinx installation ===== | ||
| * Попросить админа поставить сам sphinx | * Попросить админа поставить сам sphinx | ||
| * создать каталог scj/sphinx | * создать каталог scj/sphinx | ||
| - | * Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). | + | * Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). |
| + | * Запустить индексирование базы (так же делает админ)< | ||
| + | * вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа. | ||
| + | Все. | ||
| + | |||
| + | |||
| + | Надо периодически запускать индексирование базы: | ||
| < | < | ||
| - | source scj | + | indexer --all --rotate |
| - | { | + | </ |
| - | 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 | ||
| - | // ====== | + | ===== Sphinx Delta Config |
| - | sql_query = SELECT id, date, tags, alt, description, | + | При создании индекса sphinx делает индекс текущего состояния базы и если после индексирования в базе были какие-либо изменения, то sphinx не найдет новых данных, тк они были добавлены после индексирования. |
| - | | + | |
| - | sql_attr_timestamp = date | + | Логический вывод из этого: надо проводить реиндексацию после каждого изменения в базе, однако проблема в том, что |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| + | Что бы решить эту проблему придумали delta index – это индекс в который попадут измения, | ||
| + | При поиска sphinx будет искать и в основном индексе и в дельта индексе, | ||
| - | // | ||
| - | sql_query = SELECT id, UNIX_TIMESTAMP(activation_date) as date, tags, alt, description, | ||
| - | | ||
| - | sql_attr_timestamp = date | + | Итого : |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| - | // | + | в основную часть, которая у вас уже есть надо добавить после |
| + | sql_query_pre = SET NAMES utf8 | ||
| - | sql_query = SELECT id, crc32(g.gallery_md5) as gallery_md5_crc, | + | строку |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | sql_attr_timestamp = date | + | sql_query_pre |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| - | sql_attr_uint | + | |
| - | sql_attr_float | + | |
| - | sql_attr_uint | + | |
| - | sql_attr_uint = gallery_md5_crc | + | |
| + | Теперь надо добавить создание дельта индекса | ||
| + | < | ||
| + | |||
| + | source delta : your_name_source | ||
| + | { | ||
| + | sql_query_pre = SET NAMES utf8 | ||
| + | |||
| + | sql_query = SELECT gi.gallery_id, | ||
| + | (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 group_concat(gss.group_id) FROM rot_gallery_stats1 as gss \ |
| + | WHERE gss.gallery_id | ||
| + | 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 | ||
| + | AND gallery_status = ' | ||
| + | and gs.best_thumb = ' | ||
| + | | ||
| } | } | ||
| - | index scj_index | + | index delta : your_name_index |
| { | { | ||
| - | source = scj | + | |
| - | path = /path_to_data/scj/sphinx/ | + | path = /your_full_path/data/delta |
| - | docinfo = extern | + | |
| - | morphology | + | |
| } | } | ||
| - | Тут надо заменить: | ||
| - | scj_mysql_login | ||
| - | scj_mysql_password | ||
| - | scj_db | ||
| - | path_to_data | ||
| </ | </ | ||
| - | * Запустить | + | |
| - | * вам | + | Как можно заметить запрос такой же, отличается только наличием в выборке по sphinx_max_gallery_id. |
| + | |||
| + | После этого надо доабвить в крон индексацию новых записей | ||
| + | |||
| + | | ||
| + | |||
| + | После создания индекса надо прописать | ||
| + | |||
| + | и раз в сутки | ||
| + | |||
| + | indexer --rotate --merge your_name_index delta | ||
| Все. | Все. | ||
| - | **NOTE** Небольшое отступление про Sphinx. Его можно представить как урезанную версию вашей mysql базы. В mysql базе содержится информация условно id - дата добавления - описания - тумбы и тд. | ||
| - | Sphinx условно делает " | + | ===== Search Log ===== |
| - | Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД, и скрипт едлает выборку | + | Когда пользователь |
| + | |||
| + | Для этого добавляем в конфиг сфинкса | ||
| - | Для этого надо периодически запускать индексирование базы: | ||
| < | < | ||
| - | 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, | ||
| + | |||
| + | sql_attr_uint | ||
| + | sql_attr_uint | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | index search_queries_index | ||
| + | { | ||
| + | source = search_queries | ||
| + | path = / | ||
| + | docinfo = extern | ||
| + | morphology | ||
| + | } | ||
| + | |||
| </ | </ | ||
| + | |||
| + | |||
| + | и прописываем в сетингах Sphinx Search Log Index. Теперь этот индекс будет использован для выборки например похожих запросов для поиска, | ||
| + | |||
| + | |||
| + | При этом так же нельзя забывать про реиндексацию. например, | ||
| + | ===== 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 | ||
| + | |||
| Line 116: | Line 196: | ||
| Можно так же сортировать результаты поиска по дате (domain/? | Можно так же сортировать результаты поиска по дате (domain/? | ||
| - | |||
| - | В 50 добавился еще вариант сортировки результатов по ctr (domain/? | ||
| Line 124: | Line 202: | ||
| Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, | Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, | ||
| - | min_word_len = 3 # Минимальная длина индексируемого слова | + | |
| - | min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе) | + | min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе) |
| - | enable_star = 1 # Использовать оператор усечения " | + | enable_star = 1 # Использовать оператор усечения " |
| Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя. | Но конечно лучше всего пройтись по документации sphinx и выбрать параметры для себя. | ||
| + | |||
| + | |||
| + | ===== Sphinx Reindex ===== | ||
| + | |||
| + | Об этом написано выше, но стоит повторить. Сфинкс - это не магия, он ищет по своему индексу. Свой индекс у него получается когда он проводит индксацию вашей базы. Если вы изменили базу (добавили галер, удалили и тп), а реиндексацию сфинкса не запустили - сфинкс про это не узнает. | ||
| + | |||
| + | Это значит, | ||
| + | ===== Mysql Search ===== | ||
| + | |||
| + | По дефолту для поиска используется конструкция примерно WHERE description LIKE ' | ||
| + | |||
| + | 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, | ||
| + | |||
| + | Лучший вариант - это настройка Sphinx о чем рассказано ниже. | ||
| + | |||
| + | Но есть компромисный вариант: | ||
| + | |||
| + | Итого если вы хотите использовать этот вариант, | ||
| + | |||
| + | < | ||
| + | ALTER TABLE `rot_gallery_data1` ADD FULLTEXT ( | ||
| + | `alt` , | ||
| + | `description` | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | И переключить в настройках опцию на поиск FullText. | ||
| + | |||
| + | |||
| + | |||
ru/new_rotation_sphinx.1391019561.txt.gz · Last modified: (external edit)
