ElasticsearchサーバーにJSONファイル(100個のドキュメントを含む)をインポートする方法はありますか?大きなjsonファイルをes-serverにインポートしたい。
Bulk API を使用する必要があります。各jsonドキュメントの前にヘッダー行を追加する必要があることに注意してください。
$ cat requests
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests; echo
{"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1,"ok":true}}]}
Dadoonetがすでに述べたように、バルクAPIがおそらく道を行くでしょう。バルクプロトコル用にファイルを変換するには、 jq を使用できます。
ファイルにドキュメントのみが含まれていると仮定します。
$ echo '{"foo":"bar"}{"baz":"qux"}' |
jq -c '
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
また、ファイルに最上位リストのドキュメントが含まれている場合は、最初に展開する必要があります。
$ echo '[{"foo":"bar"},{"baz":"qux"}]' |
jq -c '
.[] |
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
jqの-c
フラグは、各ドキュメントが1行にあることを確認します。
まっすぐにカールしてパイプしたい場合は、--data-binary @-
、および-d
、それ以外の場合、curlは改行を再び削除します。
誰かがこれを望んでいると思うので、見つけやすくします。
参考-これは、新しいESインスタンスと同じサーバーでNode.js(基本的にバッチスクリプトとして)を使用しています。それぞれ4000項目の2つのファイルで実行し、共有仮想サーバーで約12秒しかかかりませんでした。 YMMV
var elasticsearch = require('elasticsearch'),
fs = require('fs'),
pubs = JSON.parse(fs.readFileSync(__dirname + '/pubs.json')), // name of my first file to parse
forms = JSON.parse(fs.readFileSync(__dirname + '/forms.json')); // and the second set
var client = new elasticsearch.Client({ // default is fine for me, change as you see fit
Host: 'localhost:9200',
log: 'trace'
});
for (var i = 0; i < pubs.length; i++ ) {
client.create({
index: "epubs", // name your index
type: "pub", // describe the data thats getting created
id: i, // increment ID every iteration - I already sorted mine but not a requirement
body: pubs[i] // *** THIS ASSUMES YOUR DATA FILE IS FORMATTED LIKE SO: [{prop: val, prop2: val2}, {prop:...}, {prop:...}] - I converted mine from a CSV so pubs[i] is the current object {prop:..., prop2:...}
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response); // I don't recommend this but I like having my console flooded with stuff. It looks cool. Like I'm compiling a kernel really fast.
}
});
}
for (var a = 0; a < forms.length; a++ ) { // Same stuff here, just slight changes in type and variables
client.create({
index: "epubs",
type: "form",
id: a,
body: forms[a]
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response);
}
});
}
これで自分自身以上のことができることを願っています。ロケット科学ではありませんが、誰かを10分節約できる可能性があります。
乾杯
jqは、軽量で柔軟なコマンドラインJSONプロセッサです。
使用法:
cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-
ファイルfile.jsonを取得し、最初に-cフラグを使用してその内容をjqにパイプして、コンパクトな出力を作成します。ナゲットは次のとおりです。jqは、入力行ごとに1つだけでなく複数のオブジェクトを構築できるという事実を利用しています。各行に対して、JSON Elasticsearchが必要とするコントロール(元のオブジェクトのIDを使用)を作成し、元のJSONオブジェクト(。)である2行目を作成します。
この時点で、JSONはElasticsearchのバルクAPIが期待するようにフォーマットされているので、ElasticsearchにPOSTするcurlにパイプするだけです!
クレジットは Kevin Marsh
インポートはできませんが、ES APIを使用してドキュメントのインデックスを作成できます。
インデックスAPIを使用して各行を読み込む(ファイルを読み取り、curl呼び出しを行うために何らかのコードを使用する)か、インデックスバルクAPIを使用してすべてを読み込むことができます。データファイルは、それで動作するようにフォーマットできると仮定します。
シェルに慣れている場合は、簡単なシェルスクリプトでうまくいくでしょう(テストされていない)。
while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json
長期的には、おそらくPythonパイまたはElastic-Searchクライアントのいずれかを使用します。
Stream2es は、esにデータをすばやくロードするためにも非常に便利で、ファイルを単純にストリーミングする方法があるかもしれません。
Stream2es はIMOの最も簡単な方法です。
例えばJSONドキュメントのリストを含むファイル「some.json」を1行に1つずつ想定します。
curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type
elasticsearch Gathererプラグインを使用できます
ElasticsearchのGathererプラグインは、スケーラブルなデータの取得とインデックス作成のためのフレームワークです。コンテンツアダプタは、Elasticsearchノード上で配布可能な特別な種類のプラグインであるGatherer Zipアーカイブに実装されます。ジョブリクエストを受信し、ローカルキューで実行できます。ジョブの状態は特別なインデックスで維持されます。
このプラグインは開発中です。
マイルストーン1-Gathererのzipをノードに展開する
マイルストーン2-ジョブの仕様と実行
マイルストーン3-JDBC RiverをJDBC Gathererに移植する
マイルストーン4-ロード/キューの長さ/ノード名、cronジョブによるGathererジョブの分散
マイルストーン5-より多くの収集者、より多くのコンテンツアダプタ
1つの方法は、一括挿入を行うbashスクリプトを作成することです。
curl -XPOST http://127.0.0.1:9200/myindexname/type/_bulk?pretty=true --data-binary @myjsonfile.json
挿入を実行した後、次のコマンドを実行してカウントを取得します。
curl http://127.0.0.1:9200/myindexname/type/_count