web-dev-qa-db-ja.com

Elasticsearchサーバーにjsonファイル(100個のドキュメントを含む)をインポートする方法はありますか?

ElasticsearchサーバーにJSONファイル(100個のドキュメントを含む)をインポートする方法はありますか?大きなjsonファイルをes-serverにインポートしたい。

30

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}}]}
18
dadoonet

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は改行を再び削除します。

39
Peter

誰かがこれを望んでいると思うので、見つけやすくします。

参考-これは、新しい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分節約できる可能性があります。

乾杯

11
Deryck

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

10
max

インポートはできませんが、ES APIを使用してドキュメントのインデックスを作成できます。

インデックスAPIを使用して各行を読み込む(ファイルを読み取り、curl呼び出しを行うために何らかのコードを使用する)か、インデックスバルクAPIを使用してすべてを読み込むことができます。データファイルは、それで動作するようにフォーマットできると仮定します。

詳細はこちら:ES API

シェルに慣れている場合は、簡単なシェルスクリプトでうまくいくでしょう(テストされていない)。

while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json

長期的には、おそらくPythonパイまたはElastic-Searchクライアントのいずれかを使用します。

githubのパイ
弾性検索python client

Stream2es は、esにデータをすばやくロードするためにも非常に便利で、ファイルを単純にストリーミングする方法があるかもしれません。

8
mconlin

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
5
Jon Burgess

高速でシンプルなバルクインデクサーである esbulk を使用できます。

$ esbulk -index myindex file.ldj

asciicast は、約11秒でProject GutenbergデータをElasticsearchにロードすることを示しています。

免責事項:私は著者です。

4
miku

elasticsearch Gathererプラグインを使用できます

ElasticsearchのGathererプラグインは、スケーラブルなデータの取得とインデックス作成のためのフレームワークです。コンテンツアダプタは、Elasticsearchノード上で配布可能な特別な種類のプラグインであるGatherer Zipアーカイブに実装されます。ジョブリクエストを受信し、ローカルキューで実行できます。ジョブの状態は特別なインデックスで維持されます。

このプラグインは開発中です。

マイルストーン1-Gathererのzipをノードに展開する

マイルストーン2-ジョブの仕様と実行

マイルストーン3-JDBC RiverをJDBC Gathererに移植する

マイルストーン4-ロード/キューの長さ/ノード名、cronジョブによるGathererジョブの分散

マイルストーン5-より多くの収集者、より多くのコンテンツアダプタ

参照 https://github.com/jprante/elasticsearch-gatherer

3
user5722411

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
0
9digitdev