#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)