【问题标题】:How to index ActiveRecord models async with Elasticsearch gem and delayed_job如何使用 Elasticsearch gem 和 delay_job 异步索引 ActiveRecord 模型
【发布时间】:2017-09-18 15:26:18
【问题描述】:

我如何使用elasticsearch来索引类似于sidekiq example的异步

我正在使用delayed_job 而不是sidekiq。

【问题讨论】:

    标签: activerecord elasticsearch delayed-job


    【解决方案1】:

    创建一个可搜索的关注点和一个特殊的索引器类(我把它放在 lib/indexer.rb 中),它适用于任何 ActiveRecord 模型并按 ID 查找。

    关注/searchable.rb

    require 'elasticsearch/model'
    
    module searchable
      extend activesupport::concern
    
      included do
        include elasticsearch::model
        after_touch() {indexer.delay.update(self.class.name, id)}
    
        after_commit lambda {indexer.delay.create(self.class.name, id)},  on: :create
        after_commit lambda {indexer.delay.update(self.class.name, id)},  on: :update
        after_destroy lambda {indexer.delay.delete(self.class.name, id)}
      end
    
    end
    

    lib/indexer.rb

    class Indexer
      def self.create(klass_name, id)
        doc = klass_name.constantize.find(id)
        doc.__elasticsearch__.index_document
      end
    
      def self.update(klass_name, id)
        doc = klass_name.constantize.find(id)
        doc.__elasticsearch__.update_document
      end
    
      def self.delete(klass_name, id)
        # it's already deleted, so we have to delete it old school
        doc = klass_name.constantize.new
        doc.id = id
        doc.__elasticsearch__.delete_document 
      end
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多