我已经浏览了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
由于某些原因,当我将属性转换为json时,批量'import'方法不是尊重Member对象的id,而是在ES中生成唯一的id。一旦我向'import'方法提交红宝石哈希,一切都按预期工作。 –