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 '
urln'est-elle pas erronée?J'ai raté lors de la copie. Ce n'est pas le problème. Mise à jour de la question.