Как вставить уже созданную строку в формате json в Elasticsearch Bulk

В скрипте Python,

Я пытаюсь для asticsearch.helpers.bulk для хранения нескольких записей.

Я получу строку в формате json из другого программного обеспечения и хочу прикрепить ее в исходной части

Я получил формат helpers.bulk по этому ответу

часть моего кода:

def saveES(output,name):
    es = Elasticsearch([{'host':'localhost','port':9200}]) 
    output = output.split('\n')
    i=0
    datas=[]
    while i<len(output):
            data = {
                    "_index":"name",
                    "_type":"typed",
                    "_id":saveES.counter,
                    "_source":[[PROBLEM]]
            }
            i+=1
            saveES.counter+=1
            datas.append(data)

    helpers.bulk(es, datas)

Я хотел бы прикрепить строку в формате json в [[ПРОБЛЕМА]]

Как я могу прикрепить его? Я старался, но это не выводится в правильном..

если я использую:

"_source":{
"image_name":'"'+name+'",'+output[i]
}

и результат печати данных:

{'_type': 'typed', '_id': 0, '_source': {'image_name': '"nginx","features": "os,disk,package", "emit_shortname": "f0b03efe94ec", "timestamp": "2017-08-18T17:25:46+0900", "docker_image_tag": "latest"'}, '_index': 'name'}

Этот результат показывают, что объединены в одну строку.

но я ожидаю:

{'_type': 'typed', '_id': 0, '_source': {'image_name': 'nginx','features': 'os,disk,package', 'emit_shortname': 'f0b03efe94ec', 'timestamp': '2017-08-18T17:25:46+0900', 'docker_image_tag': 'latest'}, '_index': 'name'}

1 ответ

В вашем коде много проблем.

  1. Вы переопределяете значение data в вашей петле
  2. Вы не уважаете никаких норм (Pesp8 и прочее)
  3. Вы пока вместо списка понимания
  4. Вы создали 2 бесполезные переменные
  5. Вы создаете свои функции в своей функции

Вот ваш улучшенный код

es = Elasticsearch([{'host':'localhost','port':9200}]) # You don't have to initialise this variable every time you are calling the function but only once.


def save_es(output,es):  # Peps8 convention
    output = output.split('\n') # you don't need a while loop. A comprehension loop will avoid a lot of trouble
    data = [    # Please without s in data
       {
          "_index": "name",
          "_type": "typed",
          "_id": index,
          "_source": {
              "image_name":"name" + name}
        }
        for index, name in enumerate(output)
    ]    
    helpers.bulk(es, data)

save_es(output, es)

Надеюсь, это поможет.

Другие вопросы по тегам