1

投稿データのjsonオブジェクトに使用するのと同等のURLリクエストを改行で区切って送信したいと思います。これは、Elasticsearchの2つのアイテムに一括でインデックスを付けるためのものです。

これは正常に機能します。

curl -XPOST 'localhost:9200/myindex/mydoc?pretty=true' --data-binary @myfile.json

ここでmyfile.json:

{"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}    
{"title": "hello"}
{"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}
{"title": "world"}

私がそれを使って試してみると:

req = urllib2.Request(url,data=
json.dumps({"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}) + "\n" +
json.dumps({"title":"hello"}) + "\n" + 
json.dumps({"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}) + "\n" +
json.dumps({"title":"world"})

私は得る:

HTTP Error 500: Internal Server Error
4

2 に答える 2

2

「HTTP エラー 500」は、インデックス名またはインデックス タイプを含めるのを忘れたことが原因である可能性があります。

また、一括挿入の場合、elasticsearch は最後のレコードの後に​​ "\n" 文字が必要です。そうしないと、そのレコードが挿入されません。

試す:

import urllib2
import json

url = 'http://localhost:9200/myindex/mydoc/_bulk?pretty=true'

data = json.dumps({"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}) + "\n" + json.dumps({"title":"hello"}) + "\n" + json.dumps({"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}}) + "\n" + json.dumps({"title":"world"})

req = urllib2.Request(url,data=data+"\n")

f = urllib2.urlopen(req)
print f.read()

または、いくつかのリファクタリングを使用して:

import urllib2
import json

url = 'http://localhost:9200/myindex/mydoc/_bulk?pretty=true'

data = [
    {"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}},
    {"title":"hello"},
    {"index": {"_parent": "btaCovzjQhqrP4s3iPjZKQ"}},
    {"title":"world"}
]

encoded_data = "\n".join(map(json.dumps,data)) + "\n"

req = urllib2.Request(url,data=encoded_data)

f = urllib2.urlopen(req)
print f.read()
于 2013-03-29T22:09:47.940 に答える
2

私にとってのユースケースは、実際には ElasticSearch の bulk_index リクエストです。

これは、次の方法ではるかに簡単になりrawesます。

import rawes
es = rawes.Elastic('localhost:9200')

with open('myfile.json') as f:
   lines = f.readlines()

es.post('someindex/sometype/_bulk', data=lines)
于 2013-03-24T09:22:18.850 に答える