J'utilise l'API Delete By Query pour supprimer un certain nombre de documents. Ci-dessous, curl fonctionne parfaitement:
import requests,json url = "http://elastic.tool.com:80/tom-access/doc/_delete_by_query" headers = {"Content-type": "application/json", "Accept": "application/json", "Authorization": "Basic asdadsasdasdasd"} data = { 'query':{ 'terms':{ '_id':[ 'xxxxx', 'yyyyy' ] } } } try: r = requests.post(url, headers=headers, data=data, verify=False) except blablaaa response_dict = r.json() print(response_dict)
Maintenant, je veux utiliser la bibliothèque requests
en Python pour obtenir la même chose.
POST /tom-access/doc/_delete_by_query { "query": { "terms": { "_id": [ "xxxxx", "yyyyy" ] } } }
J'obtiens l'erreur ci-dessous:
{'error': {'root_cause': [{'type': 'json_parse_exception', 'reason': "Jeton non reconnu 'requête': attendait ('vrai', 'faux' ou 'null') \ n à [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; ligne: 1, colonne: 7] "}], 'type': 'json_parse_exception', 'reason': "Jeton non reconnu 'requête': attendait ('vrai', 'faux' ou 'null') \ n à [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; ligne: 1, colonne: 7] "}, 'status': 500}
Qu'est-ce que je fais de mal?
3 Réponses :
Je pense que vous devriez essayer d'utiliser des guillemets doubles ( ""
) dans la variable data
au lieu de guillemets simples ( ''
). Convertissez également la requête en utilisant json.dumps ()
.
Voici un exemple tiré de https: // marcobonzanini. com / 2015/02/02 / how-to-query-elasticsearch-with-python / , où il montre l'utilisation de la bibliothèque requests
:
def search(uri, term): """Simple Elasticsearch Query""" query = json.dumps({ "query": { "match": { "content": term } } }) response = requests.get(uri, data=query) results = json.loads(response.text) return results
Il existe également le client elasticsearch officiel pour python elasticsearch-py .
vous devez changer la façon dont vous lancez la requête depuis python.
donc au lieu de,
r = requests.post(url, headers=headers, data=json.dumps(data), verify=False)
essayez d'utiliser,
r = requests.post(url, headers=headers, data=data, verify=False)
Il se plaint que vous ne transmettez pas votre structure de données au format de données JSON, vous devez donc d'abord la vider dans JSON. De plus, la bibliothèque de requêtes
Python a un raccourci pour cela, vous n'avez donc pas besoin de vider votre variable dans JSON avec:
r = requests.post(url, headers=headers, json=data, verify=False)
Au lieu de cela, vous pouvez simplement utiliser json = data
option comme celle-ci:
r = requests.post(url, headers=headers, data=json.dumps(data), verify=False)
L '
url
n'est-elle pas erronée?J'ai raté lors de la copie. Ce n'est pas le problème. Mise à jour de la question.