2013-05-20 3 views
0

У меня есть таблица, которая показывает данные из elasticsearch через шину. Таблица извлекает данные async в формате json. Итак, если я попытаюсь изменить запись, таблица по-прежнему показывает «старое» состояние записи (действие перенаправляется непосредственно после сохранения в индекс/таблицу). То же самое, когда я удаляю или добавляю запись.Tire ActiveModel callback slow

Но это случается только иногда. Я узнал, что когда я добавляю «sleep (0.3)» к действию индекса до того, как данные будут восстановлены, он будет работать.

Моя модель:

# encoding: utf-8 
class Group 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    # Relations 
    has_and_belongs_to_many :users, index: true 
    has_many :group_rights, dependent: :destroy 

    accepts_nested_attributes_for :group_rights, allow_destroy: true, autosave: true 
    ### 

    # Validates 
    validates :name, presence: true 
    validates :description, presence: true 
    ### 

    # Mongoid Fields 
    field :name, type: String 
    field :description, type: String 
    ### 

    # Elasticsearch 
    index_name "#{Tire::Model::Search.index_prefix}groups" # Indexname /initializers/tire.rb 
    mapping do 
    indexes :_id, :index => :not_analyzed 
    indexes :name 
    indexes :description 
    end 

    def to_indexed_json 
    to_json 
    end 
    ### 

    # Methods 

    ### 

end 

Я думаю, что это что-то делать с шинной обратного вызова. Но почему это так медленно? Может быть, лучший способ обновить индекс соответственно.

Я использую Elasticsearch 0.90 с openjdk-6 на debian squeeze.

Спасибо, Патрика

ответ

0

Elasticsearch не пишет обновления своего индекс немедленно, то есть обновления-интервал, который по умолчанию 1 вторых, так что, если записи и чтения происходит в менее 1 секунду, то, что может быть причиной вашей проблемы. Вы можете снизить интервал обновления (я не советую этого) или просто вызвать обновление после того, как вы напишите в Elasticsearch в контроллере с помощью

Tire.index("whatever").refresh 
+0

Спасибо! Я этого не знал. Я добавил обновление вручную к контроллеру. – patrickkeller

+0

Будьте осторожны, «обновление» не без затрат. Лучше всего оставить его в Elasticsearch - если вам действительно не нужны изменения для распространения сразу, например, в тесте интеграции. – karmi

+0

Если вы используете [searchkick] (https://github.com/ankane/searchkick), вы можете использовать 'Model.searchkick_index.refresh' – zevstatiev

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