首页 > 解决方案 > 如何使用 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 )


更新:


当前解决方案/解决方法:经过数小时的调试仍然不知道问题出在哪里。查询被重写为 request-body-only,例如:

GET log_index/_doc/_search
{
  "query": { "bool": { ... } },
  "aggs": { ... }
}

一切都按预期工作,但构建正确的布尔查询很棘手。

标签: pythonamazon-web-serviceselasticsearchpython-requests

解决方案


推荐阅读