Удаление Elasticsearch с помощью API запросов: Curl работает, но не может достичь того же с помощью Python (запросы)?

#elasticsearch

#elasticsearch

Вопрос:

Я использую Delete по API запросов для удаления группы документов. Ниже curl работает идеально:

 POST /tom-access/doc/_delete_by_query
{
  "query": {
    "terms": {
      "_id": [
        "xxxxx",
        "yyyyy"
      ]
    }
  }
}
  

Теперь я хочу использовать requests библиотеку в Python для достижения того же.

 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)
  

Я получаю сообщение об ошибке ниже:

{‘error’: {‘root_cause’: [{‘type’: ‘json_parse_exception’, ‘reason’: «Нераспознанный токен ‘query’: ожидал (‘true’, ‘false’ или ‘null’) n в [Источник: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; строка: 1, столбец: 7]»}], ‘type’: ‘json_parse_exception’, ‘reason’: «Нераспознанный токен ‘query’: ожидал (‘true’, ‘false’ или ‘null’) n в [Источник: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; строка: 1, столбец: 7]»}, ‘статус’: 500}

Что я делаю не так?

Комментарии:

1. Разве это не url так?

2. Я перепутал при копировании. Это не проблема. Обновлен вопрос.

Ответ №1:

Я думаю, вам следует попробовать использовать двойные кавычки ( "" ) в data переменной вместо одинарных кавычек ( '' ). Кроме того, преобразуйте запрос с помощью json.dumps() .
Вот пример из https://marcobonzanini.com/2015/02/02/how-to-query-elasticsearch-with-python /, где показано использование 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
  

Существует также официальный клиент elasticsearch для python elasticsearch-py.

Ответ №2:

вам нужно изменить способ отправки запроса из python.

поэтому вместо,

 r = requests.post(url,
                 headers=headers,
                 data=data,
                 verify=False)
  

попробуйте использовать,

 r = requests.post(url,
                 headers=headers,
                 data=json.dumps(data),
                 verify=False)
  

Ответ №3:

Он жалуется, что вы не передаете свою структуру данных в формате данных JSON, поэтому вам нужно сначала сбросить ее в JSON. Также requests в библиотеке Python есть короткий путь для этого, поэтому вам не нужно сбрасывать вашу переменную в JSON с:

 r = requests.post(url,
                 headers=headers,
                 data=json.dumps(data),
                 verify=False)
  

Вместо этого вы можете просто использовать json=data такую опцию:

 r = requests.post(url,
                 headers=headers,
                 json=data,
                 verify=False)