使用python请求模块进行弹性搜索批量/批量索引

时间:2012-12-21 20:14:48

标签: indexing elasticsearch python-requests

我有一个小的(~50,00)json字典数组,我想在ES中存储/索引。我的偏好是使用python,因为我想索引的数据来自csv文件,通过python加载并转换为json。或者,我想跳过转换为json的步骤,并简单地使用我拥有的python词典数组。无论如何,快速搜索揭示了ES的批量索引功能。我想做这样的事情:

post_url = 'http://localhost:9202/_bulk'
request.post(post_url, data = acc )    # acc a python array of dictionaries

post_url = 'http://localhost:9202/_bulk'
request.post(post_url, params = acc )    # acc a python array of dictionaries

两个请求都提供[HTTP 500错误]

3 个答案:

答案 0 :(得分:2)

我的理解是你必须有一个"命令"每行(索引,创建,删除...),然后其中一些(如索引)在下一行上获取一行数据,如此

{'index': ''}\n
{'your': 'data'}\n
{'index': ''}\n
{'other': 'data'}\n

注意新行,即使在最后一行。

如果您发送到../index/type/_bulk,则上面的空索引对象有效,否则您需要指定我认为的索引和类型,还没有尝试过。

答案 1 :(得分:0)

我对Python知之甚少,但你看过Pyes吗? Pyes支持Bulk。

答案 2 :(得分:0)

您可以使用以下功能:

def post_request(self, endpoint, data):
   endpoint = 'localhost:9200/_bulk'
   response = requests.post(endpoint, data=data, headers={'content-type':'application/json', 'charset':'UTF-8'})

   return response

作为数据,您需要传递一个字符串,如:

{ "index" : { "_index" : "test-index", "_type" : "_doc", "_id" : "1681", "routing" : 0 }}
{ "field1" : ... , ..., "fieldN" : ... }
{ "index" : { "_index" : "test-index", "_type" : "_doc", "_id" : "1684", "routing" : 1 }}
{ "field1" : ... , ..., "fieldN" : ... }

确保添加" \ n"在每一行的末尾。