2013-11-14 2 views
7

У меня есть приложение, которое работать на Ubuntu 12.04 с Nginx + пассажир И в моем методе я пытаюсь восстановить сфинкса индекс так:обновление индекса мышления сфинкс в рубиновой код

def update_sphinx_index 
    Rails.application.load_tasks 
    Rake::Task['ts:rebuild'].invoke 
    redirect_to admin_mainpage_path 
    end 

также я стараюсь:

`rake ts:index` 

но ничего не случилось, индекс sphinx не восстанавливается. Что я делаю неправильно? Может быть, мне нужно сделать это с некоторыми привилегиями или с чем-то еще, потому что, когда я делаю рейк ts: rebuild в командном терминале все в порядке, а index rebuild.

+0

Возможно, вам нужно установить 'RAILS_ENV'? –

+0

@Monk_Code, что вы имеете в виду? код? Rake :: Task ['ts: rebuild RAILS_ENV = production']. Invoke – brabertaser19

+0

Индексирование в течение ограниченного времени после команды 'bundle exec rake ts: index RAILS_ENV = staging' на этапе –

ответ

3

ts:rebuild останавливает сфинкс, восстанавливает индекс, а затем перезапускается, и его следует запускать только в том случае, если вы изменили структуру своего индекса.

Вместо этого вы должны использовать ts:index, если вы только добавляете новые данные.

Что касается того, почему задача rake не выполняется, возможно, ваш демон поиска все еще работает.

+0

Что касается того, почему задача rake не выполняется, возможно, ваш демон поиска все еще работает. как быть, чем – brabertaser19

+0

Вы можете создать еще одну задачу, чтобы убить процесс searchd и запустить ее перед вызовом 'ts: rebuild'. [См. Здесь] (https://github.com/pat/thinking-sphinx/issues/497#issuecomment-17140584) для примера такой задачи. –

+0

как насчет Rails.application.load_tasks Rake :: Task ['ts: stop']. invoke Rake :: Task ['ts: index']. invoke Rake :: Task ['ts: start']. invoke? – brabertaser19

4

Прежде всего, мне не очень нравится идея вызова sphinx reindex из контроллера. Лучшей практикой здесь будет использование дельта для частичного индексирования (дельта с помощью resque - отличное решение для индексации в реальном времени), а затем случайное переиндекса раз в то время, чтобы сжать файлы.

Но если по какой-то причине вам действительно нужно запустить это с контроллера, я бы сказал, что есть две вещи, которые следует учитывать. Одна из них вы, вероятно, не в нужном каталоге, так что вы можете попытаться выдать системный вызов меняющегося в каталог, то исполняющего грабли, как в

`cd /path/to/your/app rake ts:index` 

Помимо этого, если вы следуете лучшие практики, пользователь выполнение вашего веб-сервера будет нерентабельным пользователем, что-то вроде пользователя, принадлежащего к группе www-data. Очень вероятно, что у этого пользователя не будет разрешений на выполнение рейка или для записи индексных файлов, поэтому убедитесь, что пользователь, начинающий ваш веб-сервер, имеет правильные разрешения.

+0

и как я могу изменить разрешение? я использую nginx + пассажира – brabertaser19

+0

, прежде всего вам нужно определить, какие у вас проблемы с разрешениями. Если ваша проблема заключается в том, что вы не можете писать файлы, вы можете просто сделать индексные файлы доступными для любого пользователя в вашей системе, так как они не представляют опасности для безопасности. Если ваша проблема заключается в том, что вы не можете выполнить rake, тогда вы должны добавить групповые разрешения с помощью chmod и убедиться, что пользователь, запускающий ваш веб-сервер, является частью одной и той же группы. –