0

Je cherche à répliquer la commande suivante à l'aide du client python ElasticSearch (et sans utiliser subprocess):ElasticSearch-py aide en vrac équivalent de boucle avec le fichier

curl -s -XPOST "localhost:9200/index_name/_bulk" --data-binary @file 

J'ai tenté d'utiliser l'aide en vrac sans chance:

es = Elasticsearch() 

with open("file") as fp: 
    bulk(
     client=es, 
     index="index_name", 
     actions=fp 
    ) 

Cela entraîne des erreurs type is missing.

Le fichier, qui est traité très bien lors de l'utilisation curl, ressemble un peu à ceci:

{"index":{"_type":"someType","_id":"123"}} 
{"field1":"data","field2":"data",...} 
{"index":{"_type":"someType","_id":"456"}} 
{"field1":"data","field2":"data",...} 
... 

S'il vous plaît noter, je préfère ne pas modifier le contenu du fichier depuis que j'ai autour de 21000 avec le même format.

Répondre

0

Le paramètre actions doit prendre une itérable (pas un descripteur de fichier) qui itérer sur les lignes de votre fichier, vous devez le faire comme ceci:

es = Elasticsearch() 

def readbulk(): 
    for line in open("file"): 
     yield line 

bulk(
    client=es, 
    index="index_name", 
    actions=readbulk 
) 
+0

Vouliez-vous dire appeler 'readbulk '? Si vous omettez '()', la fonction 'TypeError: 'ne sera pas itérable. Les handles de fichiers ont des méthodes '__iter__' et' __next__' donc, comme prévu, l'utilisation de ce générateur n'a pas fait de différence. Encore, merci d'avoir répondu. – Palisand