1

我想发送一个 URL 请求,相当于使用 post 数据中的 json 对象,用换行符分隔。这是为了为 Elasticsearch 批量索引两个项目。

这工作正常:

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

我的用例实际上是对 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 回答
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 回答