elasticsearch 格式化包含JSON的字符串时面临KeyError问题

h4cxqtbf  于 2023-04-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(240)

在下面的代码中,我面临KeyError,尽管我的语法看起来很好。

data = {'id': 20720}
query = '{"query":{"bool":{"must":[{"term":{"status.keyword":"Running"}},{"term":{"id":{id}}}],"filter":[{"term":{"status.keyword":"Running"}}]}}}'
print(query.format(**data))
Traceback (most recent call last):
  File ".\demo.py", line 3, in <module>
    print(query.format(**data))
KeyError: '"query"'

这里我格式化Elasticsearch查询,我不想使用替换字符串,因为如果data包含更多字段,我必须多次迭代它。
我希望低于输出。
{"query":{"bool":{"must":[{"term":{"status.keyword":"Running"}},{"term":{"id":20720}}],"filter":[{"term":{"status.keyword":"Running"}}]}}}

lhcgjxsq

lhcgjxsq1#

除了id变量周围的花括号外,您需要将花括号加倍

query = '{{"query":{{"bool":{{"must"... {{"term":{{"id":{id} }} }}...
n3ipq98p

n3ipq98p2#

当您在一些文本周围使用单个{}并尝试使用format方法时,它需要包含在{}中的所有属性。所以如果你看一下查询字符串,找到的第一个{是围绕查询的,我们只是将id传递给format方法。它也期待查询,所以这就是为什么你会得到这个错误。
要解决这个问题,需要将所有键值 Package 在{{}}中,以转义format方法关键字参数。您只需要 Package 那些稍后要用单个{}替换的值,而所有其他值都应该 Package 在{{}}周围。以下是固定代码。

data = {'id': 20720}
query = '{{"query":{{"bool":{{"must":[{{"term":{{"status.keyword":"Running"}}}},{{"term":{{"id":{id}}}}}],"filter": [{{"term":{{"status.keyword":"Running"}}}}]}}}}}}'
print(query.format(**data))

您将看到以下输出:{"query":{"bool":{"must":[{"term":{"status.keyword":"Running"}},{"term":{"id":20720}}],"filter": [{"term":{"status.keyword":"Running"}}]}}}

相关问题