使用python请求中的转义引号查询Elasticsearch

时间:2016-03-21 18:16:03

标签: python elasticsearch python-requests

我正在尝试使用python elasticsearch查询requests。在this post之后,我正在使用以下过程:

params = {
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "should": [
                        {
                            "query_string": {
                                "query": r'\"text in quotes\"'
                            }
                        }
                    ]
                }
            },
            "filter": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "@timestamp": {
                                    "from": 1458581389860,
                                    "to": 1458494989000
                                }
                            }
                        }
                    ]
                }
            }
        }
    },
    "size": 100,
}
response = requests.get(url, params=params)

不幸的是,查询中的引号似乎没有为elasticsearch正确转义。我也试过了:

  • '\\"text in quotes\\"'
  • response = requests.get(url, data=json.dumps(params))

等效的卷曲,有效,如下所示:

curl -XGET 'MYURL/_search?pretty' -d '{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "should": [
                        {
                            "query_string": {
                                "query": "\"test in quotes\""
                            }
                        }
                    ]
                }
            },
            "filter": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "@timestamp": {
                                    "from": 1458581389860,
                                    "to": 1458494989000
                                }
                            }
                        }
                    ]
                }
            }
        }
    },
    "size": 100,
}'

3 个答案:

答案 0 :(得分:1)

在cURL中,您正在逃避引号。 "\"text in quotes\"",这将成为"text in quotes"

你的Python问题是如果你使用像r'\"text in quotes\"'那样打印\"text in quotes\"的单引号,你就不需要逃避任何事情,因为它是一个原始字符串包含斜杠。

所以,你有两个选择:

  1. 对Python字符串使用双引号并转义"\"text in quotes\""
  2. 使用单引号和未转义的双引号'"text in quotes"'

答案 1 :(得分:0)

如果字符串不是问题,请注意字符编码。尝试管理它并使用UTF-8。

答案 2 :(得分:0)

原来,在python示例中使用的uri转到http,而curl示例的uri是https。它适用于以下更改:

  • http - > HTTPS
  • 字符串为'"text in quotes"'
  • 将查询作为数据response = requests.get(url, data=json.dumps(params))
  • 发送

我不明白为什么它之前有部分工作,100次点击被退回。