1
votes

Elasticsearch Delete By Query API: Curl fonctionne mais ne parvient pas à obtenir la même chose en utilisant Python (requêtes)?

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?


2 commentaires

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.


3 Réponses :


2
votes

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 .


0 commentaires

1
votes

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)


0 commentaires

0
votes

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)


0 commentaires