【问题标题】:Elasticsearch Delete By Query API: Curl is working but failing to achieve same using Python (requests)?Elasticsearch Delete By Query API:Curl 正在工作,但无法使用 Python(请求)实现相同的功能?
【发布时间】:2019-09-01 19:32:21
【问题描述】:

我正在使用 Delete By Query API 来删除一堆文档。下面的卷曲工作完美:

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

现在,我想在 Python 中使用 requests 库来实现相同的目的。

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': “无法识别的令牌'查询':期待('true','false'或 'null')\n 在 [来源: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803;线: 1,列:7]"}],'类型':'json_parse_exception','原因': “无法识别的令牌'查询':期待('true','false'或 'null')\n 在 [来源: org.elasticsearch.transport.netty4.ByteBufStreamInput@bc04803;线: 1,列:7]"},'状态':500}

我做错了什么?

【问题讨论】:

  • url 是不是错了?
  • 我在复制时搞砸了。这不是问题。更新了问题。

标签: elasticsearch


【解决方案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

还有python的官方elasticsearch客户端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。 Python requests 库也为此提供了捷径,因此您无需将变量转储到 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)
      

      【讨论】:

        猜你喜欢
        • 2013-04-27
        • 2013-04-02
        • 2021-06-28
        • 2019-03-04
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多