私はこのコマンドを実行しましたrake environment elasticsearch:import:model CLASS='AutoPartsMapper' FORCE=true
elasticsearch.Inデータベースに私のデータベースは10 000 000レコード=です...これはインデックスを作成するのに一日かかると思います...インデックス作成中にコンピュータの電源がオフになっていました...(2 000 000の文書を索引付けしました)文書の索引付けを続けることは可能ですか?elasticsearch(レール)でドキュメントのインデックスを作成する方法はありますか?
0
A
答えて
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
これはあなたのような何かを与えます欲しいのですが。
関連する問題
- 1. Ruby:Riドキュメントを作成する方法はありますか?
- 2. ElasticSearchドキュメントを同じインデックスで複数のタイプから集計する方法はありますか?
- 3. elasticsearchでインデックスを再作成するのを待つ方法は?
- 4. Tire - Elasticsearch - 作成時のインデックス作成をスキップする方法
- 5. GRAILSで "yield/content_for"のレールを作成する方法はありますか?
- 6. elasticsearchでファイルのインデックスを作成する方法5.5.1
- 7. Elasticsearchでインデックスとインデックスに違いはありますか?
- 8. PSTファイルを解析してelasticsearchにインデックスする方法はありますか?
- 9. mongoDB内のドキュメントにインデックスを付ける方法はありますか?
- 10. Elasticsearchでドキュメントを作成または置き換える方法は?
- 11. elasticsearchでツイッターデータをインデックスする方法は?
- 12. ElasticSearchで1M docs/secのインデックスを作成できますか?
- 13. インデックス登録後にドキュメント本文を返す方法はありますか?
- 14. Elasticsearch 1.5ですべてのドキュメントをクエリで更新する方法はありますか?
- 15. ElasticSearchまたはTireでインデックスのすべての要素を数える方法はありますか?
- 16. elasticsearchでは、ドキュメント内のどのフィールドが「ヒット」だったかを示す方法はありますか?
- 17. Elasticsearch Java APIインデックスのドキュメント数
- 18. このようなドキュメントが存在する場合、インデックス作成ドキュメントをスキップする方法はありますか?
- 19. Elasticsearchでインデックスが空であるかどうかをチェックする方法は?
- 20. ElasticSearchはJavaでインデックス作成のフィールドを削除します
- 21. Elasticsearchはドキュメントを更新するたびに自動的にインデックスを再作成しますか
- 22. Elasticsearch - 異なるアナライザで同じフィールドのインデックスを作成する方法
- 23. レールでモデルを作成する方法
- 24. Elasticsearch一括インデックスAPIが長時間ドキュメントを作成するのはなぜですか?
- 25. iPhoneでログファイルを作成する方法はありますか
- 26. ipyvegaでSVGを作成する方法はありますか?
- 27. Expressでセットアップステージを作成する方法はありますか?
- 28. Kivyでカスタムプロパティを作成する方法はありますか?
- 29. Emacsで「プロジェクトファイル」を作成する方法はありますか?
- 30. タグヘルパーでループを作成する方法はありますか?
質問は、最後の実行が終了した場所からの継続的なインデックス作成についてです。バックグラウンドジョブは、実行可能ではない可能性がありますが、一度に完了するまで実行する必要があります。 –
申し訳ありませんが、質問は後で更新されました。私はプロセスを再起動する必要があると思います。私は間違いなくあなたがこれを実行するためにコンソールを起動する必要はありませんので、このためにsidekiqを使用します.precoaterはperform_laterで動作します... sidekiqには、 –