API Elasticsearch Delete By Query: Curl работает, но не может достичь того же с помощью Python (запросы)? - PullRequest
0 голосов
/ 11 апреля 2019

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

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': «Нераспознанный токен« запрос »: ожидал (« истина »,« ложь »или 'null') \ n на [Источник: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; линия: 1, столбец: 7] "}]," тип ":" json_parse_exception "," причина ": «Нераспознанный токен« запрос »: ожидал (« истина »,« ложь »или 'null') \ n на [Источник: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803; линия: 1, столбец: 7] "}, 'status': 500}

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

так вместо

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

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

r = requests.post(url,
                 headers=headers,
                 data=json.dumps(data),
                 verify=False)
1 голос
/ 11 апреля 2019

Я думаю, вам следует попробовать использовать двойные кавычки ("") в переменной 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...