2016-06-30 10 views
0

私はこのコマンドを実行しましたrake environment elasticsearch:import:model CLASS='AutoPartsMapper' FORCE=true elasticsearch.Inデータベースに私のデータベースは10 000 000レコード=です...これはインデックスを作成するのに一日かかると思います...インデックス作成中にコンピュータの電源がオフになっていました...(2 000 000の文書を索引付けしました)文書の索引付けを続けることは可能ですか?elasticsearch(レール)でドキュメントのインデックスを作成する方法はありますか?

答えて

0

elasicsearch-rails afaikにこのような機能はありませんが、それを行う簡単なタスクを書くことができます。

namespace :es do 
    task :populate, [:start_id] => :environment do |_, args| 
    start_id = args[:start_id].to_i 

    AutoPartsMapper.where('id > ?', start_id).order(:id).find_each do |record| 
     puts "Processing record ##{record.id}" 
     record.__elasticsearch__.index_document 
    end 
    end 
end 
bundle exec rake es:populate[<start_id>]は、次のバッチを開始するから、レコードのIDを渡すと、それを起動し

これはバッチインデックス作成よりもはるかに遅い単純化されたソリューションであることに注意してください。ここで

UPDATE

は、バッチインデックス作成タスクです。はるかに高速で、自動的にレコードを継続して検出します。これまでにインポートされたレコードは、IDの順番が違っていてギャップなしで処理されていたと仮定しています。私はそれをテストしていませんが、コードの大部分は実動システムからのものです。

namespace :es do 
    task :populate_auto => :environment do |_, args| 
    start_id = get_max_indexed_id 
    AutoPartsMapper.find_in_batches(batch_size: 1000).where('id > ?', start_id).order(:id) do |records| 
     elasticsearch_bulk_index(records) 
    end 
    end 

    def get_max_indexed_id 
    AutoPartsMapper.search(aggs: {max_id: {max: {field: :id }}}, size: 0).response[:aggregations][:max_id][:value].to_i 
    end 

    def elasticsearch_bulk_index(records) 
    return if records.empty? 
    klass = records.first.class 
    klass.__elasticsearch__.client.bulk({ 
     index: klass.__elasticsearch__.index_name, 
     type: klass.__elasticsearch__.document_type, 
     body: elasticsearch_records_to_index(records) 
    }) 
    end 

    def self.elasticsearch_records_to_index(records) 
    records.map do |record| 
     payload = { _id: record.id, data: record.as_indexed_json } 
     { index: payload } 
    end 
    end 
end 
0

rails 4.2+を使用している場合は、ActiveJobを使用してスケジューリングして実行することができます。だから、最初にこれはあなたのクラスやメソッドを提供します。この

bin/rails generate job elastic_search_index 

とそれを生成する実行:あなたのアクティブなジョブ・プロバイダーとして、コンソールからsidekiqを設定

class ElasticSearchIndexJob < ApplicationJob 
    def perform 
    # impleement here indexing 
    AutoPartMapper.__elasticsearch__.create_index! force:true 
    AutoPartMapper.__elasticsearch__.import 
    end 
end 

でこれを開始:

ElasticSearchIndexJob.perform_later 

これはアクティブジョブを設定し、次の空きジョブで実行しますが、コンソールを解放します。あなたは実行中のままにしておき、後でbashでプロセスを確認することができます:sidekiq 4.1.2 app[1 of 12 busy]

は彼らに

http://ruby-journal.com/how-to-integrate-sidekiq-with-activejob/

を説明し、この記事を見てください:

ps aux | grep side 

これはあなたのような何かを与えます欲しいのですが。

+0

質問は、最後の実行が終了した場所からの継続的なインデックス作成についてです。バックグラウンドジョブは、実行可能ではない可能性がありますが、一度に完了するまで実行する必要があります。 –

+0

申し訳ありませんが、質問は後で更新されました。私はプロセスを再起動する必要があると思います。私は間違いなくあなたがこれを実行するためにコンソールを起動する必要はありませんので、このためにsidekiqを使用します.precoaterはperform_laterで動作します... sidekiqには、 –

関連する問題