2013-04-17 25 views
3

我已經瀏覽了Tire文檔,並且我明白可以使用Tire創建索引並將對象導入到Elasticsearch中,而無需使用ActiveModel includes。更新不使用Tire的輪胎索引:: Model :: Callbacks

我想保留我的模型文件完全清除任何輪胎映射,而是分開實施它們。

到目前爲止,我已經創建了一個索引對象爲我的會員模式是這樣的:

class MemberIndexer 
    def initialize(member) 
    @member = member 
    end 

    def attributes 
    { 
     id: @member.id, 
     name: @member.full_name, 
     age: @member.age, 
     birthday: @member.birthday, 
     type: 'member' 
    }.to_json 
    end 

    def self.refresh_index 
    Tire.index 'members' do 
     delete 
     create mappings: { 
     member: { 
      properties: { 
      id: { type: 'integer' }, 
      name: { type: 'string', boost: 5 }, 
      age: { type: 'integer' }, 
      birthday: { type: 'date' } 
      } 
     } 
     } 

     Member.find_in_batches do |members| 
     import members.map { |m| MemberIndexer.new(m).attributes } 
     end 
    end 
    end 
end 

能正常工作,並創建了索引,我可以正常搜索。我缺少的是可以通過使用Tire::Model::Callbacks包含的回調。是否可以使用輪胎更新索引中的單個記錄,而無需在模型中包含Tire::Model::Callbacks

例如,如果我更新Member我想手動更新成員索引中的相應項目。這可能不知道該項目的_id

我應該只使用ActiveRecord id搜索對象,然後在索引上使用update方法?

UPDATE: 我的事實,ES被索引成員與實際ActiveRecord的ID,但通過產生ES一個唯一的ID甚至以爲我是路過的ID在屬性JSON混淆。

當我通過一個Ruby散列到import方法ID字段被尊重,這個問題就走了,我現在只是做了以下更新索引記錄:

Tire.index('member') do 
    store(MemberIndexer.new(@member).attributes) 
end 

回答

1

我不知道你的意思是不知道_id,你發佈的代碼是@member.id,對吧?

但是你能完成這項計劃是這樣的:

def update_es_index! 
    Tire.index 'members' do 
    store(@member) 
    end 
end 

它會調用store method這會想出張貼到哪個URL。

+0

由於某些原因,當我將屬性轉換爲json時,批量'import'方法不是尊重Member對象的id,而是在ES中生成唯一的id。一旦我向'import'方法提交紅寶石哈希,一切都按預期工作。 –

6

update callback無非是下面的代碼

after_save do 
    update_index 
end 

所以,如果你是從調用@ member.update_index某個地方,這會更新該記錄索引更多。

+0

由於我沒有在我的Member類中包含Tyre模塊,因此'@ member'上沒有'update_index'方法。最後,儘管問題是將json提交給'import'方法。 –

+0

或者,甚至更好 - 只有當我們的索引字段更改時才更新:updated_index如果已更改&%w(名稱電子郵件已刪除實名) – Kevin

0

原來,這個問題在將Ruby散列轉換爲JSON時出現了某種錯誤的翻譯。

當我通過一個Ruby散列到import方法索引記錄用適宜的ActiveRecord的ID創建,因此我能夠只是調用store與包括ActiveRecord的ID時,我想更新索引的屬性。