如何使用Python使用bulkapi在ES中存储关键字

如何使用Python使用bulkapi在ES中存储关键字,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我必须将一些消息存储在ElasticSearch中,并与我的python程序集成。 现在,我尝试存储的消息是: d={"message":"this is message"} for index_nr in range(1,5): ElasticSearchAPI.addToIndex(index_nr, d) print d 这意味着如果我有10条消息,那么我必须重复我的代码10次。 所以我想做的是尝试创建一个脚本文件或批处理文件。 我已经检查了批量A

我必须将一些消息存储在ElasticSearch中,并与我的python程序集成。 现在,我尝试存储的消息是:

d={"message":"this is message"}
    for index_nr in range(1,5):
        ElasticSearchAPI.addToIndex(index_nr, d)
        print d
这意味着如果我有10条消息,那么我必须重复我的代码10次。 所以我想做的是尝试创建一个脚本文件或批处理文件。 我已经检查了批量API是否可以使用。 格式应如下所示:

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field2" : "value2"} }
我所做的是:

{"index":{"_index":"test1","_type":"message","_id":"1"}}
{"message":"it is red"}
{"index":{"_index":"test2","_type":"message","_id":"2"}}
{"message":"it is green"}
我还使用curl工具来存储文档

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

现在我想使用我的Python代码将文件存储到弹性搜索中。

尽管@justinachen的代码帮助我从py-elasticsearch开始,但在查看源代码后,让我做一个简单的改进:

from datetime import datetime

from elasticsearch import Elasticsearch
from elasticsearch import helpers

es = Elasticsearch()

actions = [
  {
    "_index": "tickets-index",
    "_type": "tickets",
    "_id": j,
    "_source": {
        "any":"data" + str(j),
        "timestamp": datetime.now()}
  }
  for j in range(0, 10)
]

helpers.bulk(es, actions)
es = Elasticsearch()
j = 0
actions = []
while (j <= 10):
    action = {
        "_index": "tickets-index",
        "_type": "tickets",
        "_id": j,
        "_source": {
            "any":"data" + str(j),
            "timestamp": datetime.now()
            }
        }
    actions.append(action)
    j += 1

helpers.bulk(es, actions)
es=Elasticsearch()
j=0
动作=[]
而(j(本线程中提到的其他方法使用python列表进行ES更新,这在今天不是一个好的解决方案,尤其是当您需要向ES添加数百万数据时)

更好的方法是使用python生成器——在不耗尽内存或不影响速度的情况下处理GIG数据

下面是一个来自实际用例的示例片段-将数据从nginx日志文件添加到ES进行分析

def decode_nginx_log(_nginx_fd):
    for each_line in _nginx_fd:
        # Filter out the below from each log line
        remote_addr = ...
        timestamp   = ...
        ...

        # Index for elasticsearch. Typically timestamp.
        idx = ...

        es_fields_keys = ('remote_addr', 'timestamp', 'url', 'status')
        es_fields_vals = (remote_addr, timestamp, url, status)

        # We return a dict holding values from each line
        es_nginx_d = dict(zip(es_fields_keys, es_fields_vals))

        # Return the row on each iteration
        yield idx, es_nginx_d   # <- Note the usage of 'yield'

def es_add_bulk(nginx_file):
    # The nginx file can be gzip or just text. Open it appropriately.
    ...

    es = Elasticsearch(hosts = [{'host': 'localhost', 'port': 9200}])

    # NOTE the (...) round brackets. This is for a generator.
    k = ({
            "_index": "nginx",
            "_type" : "logs",
            "_id"   : idx,
            "_source": es_nginx_d,
         } for idx, es_nginx_d in decode_nginx_log(_nginx_fd))

    helpers.bulk(es, k)

# Now, just run it.
es_add_bulk('./nginx.1.log.gz')
def解码nginx\u日志(\u nginx\u fd):
对于_nginx\u fd中的每一行:
#从每个日志行中筛选出以下内容
远程地址=。。。
时间戳=。。。
...
#elasticsearch的索引。通常为时间戳。
idx=。。。
es_字段\u键=('remote_addr','timestamp','url','status')
es_字段\u VAL=(远程地址、时间戳、url、状态)
#我们从每一行返回一个保存值的dict
es_nginx_d=dict(zip(es_字段、es_字段、vals))
#在每次迭代中返回行

收益率idx,es_nginx#d#目前我可以想到两种选择:

1.定义每个实体的索引名和文档类型:

es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_index': index, '_type': 'doc', '_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(body=body)
es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(index='my_index', doc_type='doc', body=body)
2.使用以下方法提供默认索引和文档类型:

es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_index': index, '_type': 'doc', '_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(body=body)
es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(index='my_index', doc_type='doc', body=body)
与以下各项配合使用:

es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_index': index, '_type': 'doc', '_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(body=body)
es_client = Elasticsearch()

body = []
for entry in entries:
    body.append({'index': {'_id': entry['id']}})
    body.append(entry)

response = es_client.bulk(index='my_index', doc_type='doc', body=body)
ES版本:6.4.0


ES python lib:6.3.1

看看一些python客户端,如pyes:或elasticsearch官方客户端。非常感谢,我检查了一些客户端,并尝试使用PylasticSearch。我已经用Pylastic存储了带有批量索引的文件栏。在PylasticSearch中,文档文件将在代码中。是否可以将我创建的文档文件放入代码中想要在程序外进行批量索引吗?我没有留下任何评论,因为我想代码很清楚。这对我很有效,谢谢。如果您不提供“\u id”,将自动为您生成一个旁注。我使用的是bulk()正如这个答案中所描述的,但是当我在脚本运行时检查索引时,我没有看到任何东西被上传到索引中函数一次上载一个,我立即看到结果。不确定发生了什么。我也没有收到任何错误或异常。请帮助!@Soubriquet:面临同样的问题。运气好吗?请看下面我的答案,它使用Python生成器,允许您在不需要更多RAM的情况下向ES添加数百万数据。在Python中,我强烈支持g如果无法将所有文档加载到内存中以让helpers.bulk为您进行批处理,则最好使用列表/字典理解(与变量j的枚举和范围索引相结合)以确保j,否则这将不起作用,并且仍然需要您批处理对helpers.bulk的调用。