使用 Python 请求查询 ElasticSearch

Posted

技术标签:

【中文标题】使用 Python 请求查询 ElasticSearch【英文标题】:Querying ElasticSearch with Python Requests 【发布时间】:2017-10-18 14:55:07 【问题描述】:

,当我尝试使用 python 请求查询 ElasticSearch 时,我不太能够检索结果。这是我的代码:

json_data = updateJson(sys.argv[1])

headers='Accept': 'application/json', 'Content-type': 'application/json'

elastic_url ='https://localhost:9200/logstash-kafka-wga-blueid-\*/_search'

query = json.dumps(json_data)

response = requests.get(elastic_url, data = query, auth=('xxx','xxx'), verify=False, headers = headers)

print response.text

我总是得到以下输出:

"took":1,"timed_out":false,"_shards":"total":0,"successful":0,"failed":0,"hits":"total":0,"max_score":0.0,"hits":[]

但如果我尝试使用以下 CURL 命令,我会得到正确的结果。在上面的代码 json_data 中,从 abc.json 文件中读取 json。上面的代码有什么不对吗?

curl -X GET -k -u xxx:xxx https://localhost:9200/logstash-kafka-wga-blueid-\*/_search -d @temporaryRundeckReport.json

这是我的 updateJson() 方法:

def updateJson(fileName):
with open(fileName, 'r') as file:
    json_data = file.read()
    json_data = json_data.replace('%X-FORWARDED-HOST%', sys.argv[2]);
    json_data = json_data.replace('%TIME%', sys.argv[3]);
    json_data = json_data.replace('%INTERVAL%', sys.argv[4]);

with open('temporaryRundeckReport.json', 'w+') as file:
    os.chmod('temporaryRundeckReport.json',0o777)
    file.write(json_data)
    return json_data

【问题讨论】:

你在命令行传递的查询是什么?你有什么理由不使用elasticsearch-py? 我从它读取 json 的位置传递文件“abc.json”的名称。 abc.json 中有什么内容? updateJson() 是做什么的? 我已在原帖中添加了该方法。 我正在使用通过 requests 模块存储在temporaryRundeckReport.json 中的确切json_object。为什么要修改结果? 【参考方案1】:

我认为你不需要在python版本中转义星*(删除斜杠):

elastic_url = 'https://localhost:9200/logstash-kafka-wga-blueid-*/_search'

另外,我建议使用python client library 而不是requests

【讨论】:

但我在 elasticsearch 中的索引包含“*”字符。我发现我可以这样定义它:'localhost:9200/logstash-kafka-wga-blueid-\*/_search' @akashag26 我并不是要删除* - 我的意思是你不需要* 之前的斜线(使用...blueid-* 而不是..blueid-\*)。斜线用于在shell中转义星号,但将url放入python变量时不需要。

以上是关于使用 Python 请求查询 ElasticSearch的主要内容,如果未能解决你的问题,请参考以下文章

Python 请求使用变量向 graphql 发布查询

在 Python 中使用 URL 查询字符串构造请求

在 Python 中使用 URL 查询字符串构造请求

SpringBoot-spring-data-elasticsearch7.12.0

处理带有变量的 Graphql 查询时,Python 请求抛出 400

python 示例请求Python ServiceNow JSONv2 - GetIncidents使用编码查询从ServiceNow使用JSONv2 Web服务获取多个事件