2014-11-07 4 views
0

У меня есть модель канала с двумя ассоциациями, «содержанием» и «подписками».Сортировка по количеству совпадений в мышлении Sphinx

В индексе канала пользователь имеет возможность заказывать каналы по количеству подписчиков или количеству утвержденных содержимого.

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

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

Delayed::Job.enqueue(DelayedRake.new("ts:index"), queue: "sphinx") 

Поскольку подписки не имеют индексов, я не индексировать каждый раз, когда я создаю один (я должен это делать?)

Тогда я начал использовать индексы дельты в канале, и я все еще получаю одни и те же проблемы:

ThinkingSphinx::Index.define :channel, with: :active_record, delta: true do 
    # fields 
    indexes :name, sortable: true 
    indexes description 

    # attributes 
    has created_at, sortable: true 
    has approved, type: :boolean 
    has public, type: :boolean 

    join subscriptions 
    has "COUNT(subscriptions.id)", as: :subscription_count, type: :integer, sortable: true 

    join contents.approved 
    has "COUNT(contents.id)", as: :content_count, type: :integer, sortable: true 
end 

а вот шептали ч вызова в контроллере:

def index 
    if params[:order_by].present? 
     @channels = Channel.search params[:search], 
           order: "#{params[:order_by]} DESC", 
           page: params[:page], per_page: 6 
    else 
     @channels = Channel.search params[:search], 
           order: :name, 
           page: params[:page], per_page: 6 
    end 
    end 

Подводя итог, мои вопросы будут: 1. ли мои показатели канала хорошо сформированы? 2. Должны ли подписи индексироваться, или достаточно ли присоединиться к ним в моем канальном индексе? 3. Должен ли я запускать reindex после того, как я создаю подписку/одобряю контент или дельта-индекс в канале, связан с этим, поскольку у меня есть эти два контроллера, объединенные в индекс канала?

ответ

1

Ваш индекс отлично выглядит, но если вы используете дельта (и я думаю, что это самый мудрый подход здесь, чтобы обновлять данные), тогда вы хотите, чтобы загорать дельт для связанных каналов, когда подписка или содержимое создается/редактируется/удаляется. Это описано в the documentation (смотрите раздел «Дельты и Ассоциации»), но вы будете смотреть на то, как это в обоих Subscription и содержание:

after_save :set_channel_delta_flag 
after_destroy :set_channel_delta_flag 

# ... 

private 

def set_channel_delta_flag 
    channel.update_attributes :delta => true 
end 

Учитывая вы используете Delayed работу, я бы рекомендуется исследовать ts-delayed-delta, чтобы гарантировать, что обновления delta происходят из вашего обычного потока HTTP-запросов. И я настоятельно рекомендую не запускать полный индекс после каждого изменения - у него есть потенциал довольно медленного довольно быстро (и добавление к загрузке сервера излишне).

+0

Благодарим за ответ. Я следую вашим советам и интеграции ts-delayed-delta, и у меня есть небольшой вопрос. Можно ли выбрать очередь, в которой работают дельта? – nunopolonia

+0

Если вы установите 'delayed_job_queue' в свою предпочтительную очередь для каждой соответствующей среды в' config/thinking_sphinx.yml', это должно сделать трюк. – pat

Смежные вопросы