JSONファイルをElasticsearchにインポート/インデックス付けします


89

私はElasticsearchを初めて使用し、この時点まで手動でデータを入力しています。たとえば、私は次のようなことをしました:

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

これで.jsonファイルができたので、これをElasticsearchにインデックス付けしたいと思います。私もこのようなことを試しましたが、成功しませんでした。

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json

.jsonファイルをインポートするにはどうすればよいですか?マッピングが正しいことを確認するために最初に実行する必要のある手順はありますか?


回答:


88

curlでファイルを使用する場合の正しいコマンドは、次のとおりです。

curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json

Elasticsearchはスキーマレスであるため、必ずしもマッピングは必要ありません。jsonをそのまま送信し、デフォルトのマッピングを使用すると、すべてのフィールドにインデックスが付けられ、標準のアナライザーを使用して分析されます

コマンドラインからElasticsearchを操作する場合は、curlよりも少し便利なelasticshellを確認することをお勧めします。

2019-07-10:カスタムマッピングタイプは非推奨であり、使用しないでください。上記のURLのタイプを更新して、どちらがインデックスで、どちらが「test」という名前のタイプであるかがわかりにくいようにしました。


1
コマンドを入力すると、コンソールからデータが提供されないため、機能しません。
コンラッド

2
あなたは交換し@Konradjfblouvmlxecs01localhost、右?
Ehtesh Choudhury 2014

2
clwen-「@」はcurlにjsonファイルからデータをロードするように指示します。
オリバー

1
こんにちは私はElasticSearchも初めてですが、これらの.jsonファイルをどこに保存するか教えてください。
スワヒード2014年

2
jsonファイルをどこに保存しますか?
AV94 2015年

26

現在のドキュメントによると、https//www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

curlにテキストファイル入力を提供する場合は、プレーンな-dの代わりに--data-binaryフラグを使用する必要があります。後者は改行を保持しません。

例:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

1
_bulk loadjsonファイルは有効なjsonファイルではないことに注意してください。構文は_bulkAPIリンクで提供されます。また、これらの例に示されているように_idを指定する必要はありません。_idを省略すると、自動生成された_idが提供されます。
スティーブターバー2017年


11

私は
この正確な問題のためにESLを書いたelasticsearch_loaderの作者です。

あなたはpipでそれをダウンロードすることができます:

pip install elasticsearch-loader

そして、以下を発行することで、jsonファイルをelasticsearchにロードできるようになります。

elasticsearch_loader --index incidents --type incident json file1.json file2.json

これはいいね!indexすべてのドキュメントの前に必須行を追加します。
dr0i 2018

2018-10-04 11:51:40.395741エラー試行[1/1]で例外が発生しました。これは永続的なデータ損失であり、これ以上再試行しません2018-10-04 11:51:40.395741警告チャンク0で例外が発生しました(ConnectionTimeoutが原因で--ReadTimeoutError(HTTPConnectionPool(host = 'localhost'、port = 9200):読み取りがタイムアウトしました。(読み取りタイムアウト= 10.0)))処理中
Chiel

それが機能しないという事実とは別に、どこでURLとポートを指定しますか?
Chiel 2018年

elasticsearch_loader --help完全なヘルプメッセージを表示するには、GitHubページにアクセスするか、実行してください。host:portを指定できます--es-host http://hostname:port
MosheZada 2018年

いいね。それ以外は--typeElasticsearch 6バージョンの型を除去するように冗長になるelastic.co/guide/en/elasticsearch/reference/6.0/...
ヴラドT.

8

KenHの答えに追加する

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

あなたは置き換えることができ@requests@complete_path_to_json_file

注:@ファイルパスの前に重要です


パスの例をいくつか挙げることができますか。私は「@c:\ accounts.json」を与えて、それでもそこに配置していますが、それを見つけることができません
Piyush Mittal 2016年

4
@ "c:\ accounts.json"にする必要があります
Ram Pratap 2016年

8

誰も言及していないことの1つは、JSONファイルには、「純粋な」JSONファイルのすべての行に対して、次の行が属するインデックスを指定する1行が必要です。

IE

{"index":{"_index":"shakespeare","_type":"act","_id":0}}
{"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}

それがなければ、何も機能せず、理由はわかりません


7

jsonファイルと同じディレクトリにいることを確認してから、これを実行しました

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

したがって、あなたも同じディレクトリにいることを確認し、この方法で実行してください。注:コマンドのproduct / default /は、私の環境に固有のものです。省略したり、自分に関係のあるものに置き換えたりすることができます。


6

https://www.getpostman.com/docs/environmentsからpostmanを取得し、/ test / test / 1 / _bulk?prettyコマンドでファイルの場所を指定します。 ここに画像の説明を入力してください


2
{"エラー": "URI [/ test / test / 1 / _bulk?pretty]とメソッド[POST]のハンドラーが見つかりません"}
Chiel 2018年

{"エラー": "コンテンツタイプヘッダー[テキスト/プレーン]はサポートされていません"、 "ステータス":406}
X. L

5

使用しています

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

'requests'がjsonファイルの場合、これを次のように変更する必要があります

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json

この前に、jsonファイルにインデックスが付けられていない場合は、jsonファイル内の各行の前にインデックス行を挿入する必要があります。これはJQで行うことができます。以下のリンクを参照してください:http//kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

elasticsearchチュートリアル(シェイクスピアチュートリアルの例)に移動し、使用されているjsonファイルサンプルをダウンロードして確認します。各jsonオブジェクト(個々の行)の前にインデックス行があります。これは、jqコマンドを使用した後に探しているものです。この形式はバルクAPIを使用するために必須であり、プレーンなjsonファイルは機能しません。


1

Elasticsearch 7.7以降、コンテンツタイプも指定する必要があります。

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>

0

VirtualBoxとUBUNTUを使用している場合、または単にUBUNTUを使用している場合は、便利です。

wget https://github.com/andrewvc/ee-datasets/archive/master.zip
sudo apt-get install unzip (only if unzip module is not installed)
unzip master.zip
cd ee-datasets
java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader

0

ファイルシステムAPIを介してElasticsearchAPIを公開するコードをいくつか作成しました。

たとえば、データの明確なエクスポート/インポートを行うことをお勧めします。

プロトタイプの elasticdriverを作成しました。それはFUSEに基づいています

デモ


0
  • Elastic Search 7.7以降のバージョンを使用している場合は、以下のコマンドに従ってください。

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"

  • 上記のファイルパスは/Users/waseem.khan/waseem/elastic/account.jsonです。

  • Elastic Search 6.xバージョンを使用している場合は、以下のコマンドを使用できます。

curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'

:最後に.jsonファイルに空の行を1行追加するようにしてください。そうしないと、以下の例外が発生します。

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
],
"type" : "illegal_argument_exception",
"reason" : "The bulk request must be terminated by a newline [\n]"
},
`enter code here`"status" : 400
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.