python - 如何使用 Python 使用多个查询过滤器查询 AWS ElasticSearch Service(URI 搜索)
问题描述
使用 python 的请求使用查询字符串语法查询 ElasticSearch 时,AWS 的奇怪行为。
import requests
from requests_aws4auth import AWS4Auth
...
aws_auth = AWS4Auth(access_key, secret_key, region, service, session_token=token)
res = requests.request(url=url, method=method, data=query, headers={'Content-Type': 'application/json'}, auth=aws_auth)
if not res.ok:
print(res.text)
...
当只有一个过滤器或没有过滤器时,一切正常。例如:
GET log_index/_doc/_search?q=country_code:US
{
"aggs": { ...}
}
=> 好的
但是当我添加更多查询时,它会因错误而中断:
GET log_index/_doc/_search?q=country_code:(US OR CA)
{
"aggs": { ...}
}
或者
GET log_index/_doc/_search?q=country_code:US AND os:windows
{
"aggs": { ...}
}
=> HTTP 403错误:
我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。
有没有人对如何“解决”这个问题有任何想法?
注意 1:没有多个查询,一切都按预期工作 => 这不是凭据的问题。
注意 2:在浏览器或 Kibana 中运行查询会提供预期的结果 => 查询不是问题。
注 3:尝试使用和不使用 url-encoding ( urllib.parse.quote )
更新:
- 禁用请求身份验证(通过删除 auth=aws_auth)和将 IP 列入白名单有助于
- 有/没有请求正文的行为是相同的
当前解决方案/解决方法:经过数小时的调试仍然不知道问题出在哪里。查询被重写为 request-body-only,例如:
GET log_index/_doc/_search
{
"query": { "bool": { ... } },
"aggs": { ... }
}
一切都按预期工作,但构建正确的布尔查询很棘手。
解决方案
推荐阅读
- wordpress - 自定义帖子类型在 WordPress 中给出 404 错误
- javascript - 如何使用 Date.toLocaleString() 更改时区
- php - $_FILES 不起作用
- highcharts - 无法更改 Highchart 线条颜色中的蜘蛛网
- batch-file - 如何使 .bat 文件检查程序并在未打开时重新启动,如果程序已运行 x 时间,则还重新启动程序?
- javascript - 动态更改 Dropzone url
- laravel - 带有 Laravel 和数据库的树视图
- rxjs - 可观察性以及如何控制结果速度
- ionic-framework - 离子等待GIF结束,然后改变视图
- audio - 为什么 Windows 文件属性显示 48 kHz、16 位编码的比特率:1152 kBit/s?