2015-11-21 3 views
1

Я разрабатываю поиск, который будет получать от 50 до 200 ГБ текстовых данных в день (аналогично журналам), и ему нужно только сохранить эти данные за неделю или две. Эти данные будут передаваться по каналам с постоянной скоростью (5000/в секунду, например), нон-стоп, 24 часа в сутки. Через неделю или две документ должен выпадать из индекса, который никогда не будет слышен снова.Сфинкс: поиск в режиме реального времени с истечением срока?

Индекс должен быть доступен для поиска со свободным текстом только на одном поле (довольно маленький размер, не более 512 символов). В лучшем случае схема может иметь 2 атрибута, которые можно классифицировать.

Система должна быть проиндексирована почти в режиме реального времени, когда данные подаются на нее. Приемлема задержка от 15 до 30 секунд.

Мы предпочитаем передавать данные в индекс/службу с постоянным потоком данных о трубах.

И, наконец, отдельное автономное решение предпочитает настройку распределения любого типа (это будет частью пакета для развертывания и настройки на локальных машинах для тестеров).

Я внимательно изучаю поисковую систему Sphinx с обновлениями RT через API, поскольку он проверяет большинство из них. Но я не вижу простого способа истечения срока действия документов через определенный промежуток времени.

Я знаю, что я мог отслеживать идентификаторы и временную метку и выдавать пакетный DELETE через API Sphinx. Но это создает проблему отслеживания большого количества идентификаторов в отдельном хранилище данных, которое будет нуждаться в том же вставке 5 000/в секунду и удалении их, когда это будет сделано.

У меня также есть проблема с Sphinx. Фрагментация массового вставки и массовое удаление в середине вставки.

Мы бы предпочли, чтобы поисковая система/указатель обрабатывала сам срок действия.

Я думаю, что я могу выполнить отметку WHERE timestamp < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO как предложение where в API Sphinx для сбора идентификаторов документов для удаления. Проблема с этим заключается в том, что если система не останется на пути к удалению, общее количество документов/результатов поиска будет составлять 10 миллионов, а может быть, даже миллиарды в счете после двухнедельного таймфрейма, если он должен собрать несколько дней ценность идентификаторов документов для удаления. Это не выполнимый запрос.

ответ

2

Вы можете фактически запустить

DELETE FROM rt WHERE timestamp < UNIXTIMESTAMP-OF-TWO-WEEEKS-AGO 

В запросе, чтобы удалить старые документы, что гораздо проще :)

Вам также необходимо позвонить OPTIMIZE INDEX время от времени.

Оба эти значения должны быть вызваны на какое-то расписание «cron», так как они не будут запускаться автоматически.


Возможно, вам лучше не использовать функцию Sphinxes DELETE. При записи RT-индексов, как только фрагмент RAM заполняется, он записывается как фрагмент диска. Таким образом, вы получаете несколько дисковых фрагментов на диске. Самые старые документы будут в старом пакете последовательно.

Чтобы очистить старые документы, вы можете просто избавиться от самых старых кусков.(на основе прокатки)

Проблема заключается в том, что сфинкс не включает функцию для удаления отдельных кусков.

Необходимо будет завершить поиск, удалить фрагмент (ы), обработать файлы заголовков, а затем перезапустить Sphinx. Нелегкий процесс.


Но в более общем смысле, не уверен, что сфинкс будет в состоянии идти в ногу с непрерывным потоком 5000/документов в секунду (даже ignoreing удалить на данный момент) - Sphinx, как правило, предназначены для отложенной записи нечасто, часто читайте. Он строит (по большей части) монолитный инвертированный индекс. Это отлично подходит для запросов, но очень сложно поддерживать обновление. Это не очень удобно для инкрементных обновлений.

+0

Спасибо за совет! Ну, я ничего не обновляю. Просто пишите один раз, он сидит неделю или две, а затем удаляется. Интересно, что удаление Chunk и переписывание заголовков. Я мог бы запланировать окно обслуживания минут или два раз в день, что делает то, что вы предлагаете: shutdown searchd, удалить старые куски, переписать заголовки. Если это хорошо документировано, это звучит как способ пойти. Я все еще изучаю Sphinx, поэтому, если отключить searchd, значит ли это, что я не смогу передавать данные в api? Searchd = api? – eduncan911

+0

Когда «обновление» означает обновление самого индекса hte, просто добавьте документы. Чтобы добавить единый документ, весь индекс нуждается в перетасовке, Sphinx немного смягчает его, сохраняя раздел индекса в памяти (блок RAM). Я не думаю, что файлы заголовков документированы вообще, но исходный код доступен :) В то время как searchd (процесс демона sphinx) выключается, не сможет вводить новые документы. – barryhunter