Настройка поиска часто изменяющихся данных в Sphinx?
Всем доброго праздничного дня!
Есть некоторый массив данных, по которому требуется организовать поиск, по множеству критериев.
Понимая, что конёк сфинкса — всё же полнотекстовый поиск, а в моем случае его не требуется, я таки провёл тесты, которые однозначно подтвердили — «надо брать».
Осталось спроектировать схему работы и обновления индексов.
Итак,
Данные (немного конкретики: десятки тысяч объявлений) лежат в мускуле, где с ними регулярно происходит весь спектр CRUD-операций. Допустима задержка актуальности индекса в пределах 5 минут.
Как организовать обычный индекс? Схема «основной индекс, обновляющийся в 00:00 + дельта-индекс за сегодня, обновляющийся раз в 5 минут» обеспечит обновление изменившихся данных? Как вы делали похожую задачу, если перед вами такая однажды стояла?
Сразу скажу, что в силу некоторых причин я пока не могу использовать для задачи RT-индексы — не получится быстро переделать приложение так, чтобы наряду с выполнением запросов к mysql он их отправлял в sphinx. Хотя, если есть способ, как можно настроить своего рода «репликацию» нескольких таблиц, где мастером будет мускул, а слэйвом — сфинкс — очень даже рассмотрю такой вариант.
В общем, решил с помощью дельта-индекса. Основной индекс (раз в сутки), дельта-индекс+мёрж его в основной (каждые 3 минуты). новые и обновленные документы появляются в основном индексе сами, для выбрасывания удаленных же определил sql_query_killlist в дельта-индексе. Всем спасибо!
Что такое у вас изменившиеся данные, если вы изменили вчерашние данные то конечно дельта индекс не учтет их либо их надо как то по особому менять, то есть делать новое объявление.
Я правильно вообще понимаю систему с основным + дельта-индексом: индексация дельты раз в 5 минут обеспечивает индекс _новыми_ данными, килл-лист обеспечивает непопадание в результаты поиска _удаленных_ данных, а вот что делать с обновившимися записями — вопрос?
в силу некоторых причин я пока не могу использовать для задачи RT-индексы — не получится быстро переделать приложение так, чтобы наряду с выполнением запросов к mysql он их отправлял в sphinx
теоретически можно просто сделать триггер на обновление таблиц(ы) + подцепить сервер Sphinx'а через FEDERATED storage engine
Получается, чтобы «обновить» в основном индексе имеющейся документ, нужно чтобы этот документ оказался в дельта-индексе, и плюс указать фильтр при мёрже для удаления из основного индекса удаленных и изменных документов.