Rob*_*all 3 ruby-on-rails elasticsearch tire
我已经查看了Tire文档,我知道可以使用Tire创建索引并将对象导入Elasticsearch,而无需使用ActiveModel包含.
我想保持我的模型文件完全清除任何轮胎映射,而不是单独实现它们.
到目前为止,我已经为我的Member模型创建了一个索引对象,如下所示:
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方法吗?
更新: 我感到困惑的是,ES正在使用实际的ActiveRecord id索引成员,但是在ES中生成一个唯一的ID,即使我认为我在属性json中传递了一个id.
当我将ruby哈希传递给import方法时,id字段得到了尊重,这个问题就消失了,因为我现在只需要执行以下操作来更新索引记录:
Tire.index('member') do
  store(MemberIndexer.new(@member).attributes)
end
小智 6
该更新回调无非是下面的代码更
after_save do
  update_index
end
因此,如果你从某个地方调用@ member.update_index,它将更新该记录的索引.
| 归档时间: | 
 | 
| 查看次数: | 2338 次 | 
| 最近记录: |