This shows you the differences between two versions of the page.
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 ====== | ||
+ | |||
+ | Когда ваша база разрастается до приличного размера, | ||
+ | | ||
+ | |||
+ | Sphinx это система быстрого поиска с учетом морфологии. Более того, имеет смысл внедрять ее и до достижения вашей базой приличного размера из-за преищуществ морфологического поиска. | ||
+ | |||
+ | Sphinx условно делает " | ||
+ | |||
+ | Алгоритм работы примерно такой: скрипт делает запрос в Sphinx, тот возвращает только ИД галер, и скрипт делает выборку этих ИД из mysql базы. Из этого следует то, что если меняется mysql база, то надо менять и sphinx базу. | ||
+ | |||
+ | Как работает сфинкс: | ||
+ | |||
+ | На большой базе переиндексация может быть довольно тяжелым процессом поэтому добавляется Sphinx Delta Index, смысл которого что можно индексить только новые записи, | ||
+ | |||
+ | Так же можно индекссиировать сфинксом лог поисковых запросов, | ||
+ | |||
+ | |||
+ | Сфинкс умеет по-разному искать (Sphinx Search Mod) и ранжировать результаты поиска (Sphinx Ranker Mod), в документации сфинкса полностью расписано какие они бывают и на что влияют. | ||
+ | |||
+ | |||
+ | При поиске очень общего слова может быть очень много результатов и огромная пагинация, | ||
+ | |||
+ | |||
+ | |||
+ | ===== Sphinx installation ===== | ||
+ | |||
+ | * Попросить админа поставить сам sphinx | ||
+ | * создать каталог scj/sphinx | ||
+ | * Добавить индекс смарта в конфиг sphinx (так же обычно делает админ). Сам конфиг находится в Rotation Settings - site search | ||
+ | * Запустить индексирование базы (так же делает админ)< | ||
+ | * вам остается только прописать в настройки в сетингах ротации. Настройки можно узнать у админа. | ||
+ | |||
+ | Все. | ||
+ | |||
+ | |||
+ | Надо периодически запускать индексирование базы: | ||
+ | < | ||
+ | indexer --all --rotate | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Sphinx Delta Config ===== | ||
+ | |||
+ | При создании индекса 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 = ' | ||
+ | |||
+ | |||
+ | Теперь надо добавить создание дельта индекса | ||
+ | |||
+ | < | ||
+ | |||
+ | 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, | ||
+ | | ||
+ | |||
+ | (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 = ' | ||
+ | AND gallery_status = ' | ||
+ | and gs.best_thumb = ' | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | index delta : your_name_index | ||
+ | { | ||
+ | source = delta | ||
+ | path = / | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Как можно заметить запрос такой же, отличается только наличием в выборке по sphinx_max_gallery_id. | ||
+ | |||
+ | После этого надо доабвить в крон индексацию новых записей так часто, как вам нравится строкой | ||
+ | |||
+ | indexer --rotate delta | ||
+ | |||
+ | После создания индекса надо прописать delta в Sphinx Delta Index настройках ротации. | ||
+ | |||
+ | и раз в сутки например можно присоединять дельта индекс к основному | ||
+ | |||
+ | indexer --rotate --merge your_name_index delta | ||
+ | |||
+ | |||
+ | Все. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Search Log ===== | ||
+ | |||
+ | Когда пользователь ищет что-то на сайте (domain.com/? | ||
+ | |||
+ | Для этого добавляем в конфиг сфинкса | ||
+ | |||
+ | < | ||
+ | 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 | ||
+ | |||
+ | |||
+ | |||
+ | ===== Sphinx for child (slave) sites ===== | ||
+ | |||
+ | По дефолту слейв подхватывает данные сфинкса из базы мастера. те прописав сфинкс на мастере - все слейвы начинают так же юзать сфинкс. | ||
+ | |||
+ | Тут у вас может получиться следующий момент: | ||
+ | Если слейв выносится на другой сервак - то логично что локалхост для него не работает в этом случае. | ||
+ | Опять же логично что для этого случая надо прописать не локалхост, | ||
+ | |||
+ | |||
+ | ===== Sphinx Search CTR ===== | ||
+ | |||
+ | Если вы используете поиск сфинкс то по дефолту он ищет по релевантности (domain/? | ||
+ | |||
+ | Можно так же сортировать результаты поиска по дате (domain/? | ||
+ | |||
+ | |||
+ | ===== Sphinx settings ===== | ||
+ | |||
+ | Sphinx обладает большими возможностями по настройке индексирования и поиска. Например, | ||
+ | |||
+ | min_word_len = 3 # Минимальная длина индексируемого слова | ||
+ | min_infix_len = 2 # Минимальная длина инфикса (префикс в том числе) | ||
+ | enable_star = 1 # Использовать оператор усечения " | ||
+ | |||
+ | |||
+ | Но конечно лучше всего пройтись по документации 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. | ||
+ | |||
+ | |||