Elasticsearch Python包与文档不符时,如何正确创建Enrich Policy?
Elasticsearch Python客户端创建Enrich Policy报错解决
问题描述
尝试在Elasticsearch(版本8.7.0)的摄入管道前添加Enrich Policy,使用对应版本的Python客户端执行代码时遇到错误。
执行代码
if enrich_policies: for i, (name, body) in enumerate(enrich_policies.items()): result = es.enrich.get_policy(name=name) if "config" in body: body = body["config"] # cannot pass in "body", but the individual params body_match = body.get("match") body_range = body.get("range") body_geo_match = body.get("geo_match") log_print(f"Putting policy {name} with match: {body_match}, range: {body_range}, geo_match: {body_geo_match}", "DEBUG") # upload enrich policy result = es.enrich.put_policy(name=name, match=body_match, range=body_range, geo_match=body_geo_match) # execute enrich policy result = es.enrich.execute_policy(name=name)
错误信息
File "C:\Users\xxx\source\xxx\configure_kibana_objects.py", line 152, in <module> main() File "C:\Users\xxx\source\xxx\configure_kibana_objects.py", line 116, in main result = es.enrich.put_policy(name=name, match=body_match, range=body_range, geo_match=body_geo_match) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\elasticsearch\_sync\client\utils.py", line 414, in wrapped return api(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\elasticsearch\_sync\client\enrich.py", line 188, in put_policy return self.perform_request( # type: ignore[return-value] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\elasticsearch\_sync\client\_base.py", line 389, in perform_request return self._client.perform_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\elasticsearch\_sync\client\_base.py", line 320, in perform_request raise HTTP_EXCEPTIONS.get(meta.status, ApiError)( elasticsearch.BadRequestError: BadRequestError(400, 'x_content_parse_exception', '[1:11] [policy] unknown field [name]')
环境版本
python -m pip show elasticsearch Version: 8.7.0 Summary: Python client for Elasticsearch Home-page: https://github.com/elastic/elasticsearch-py Author: Honza Král, Nick Lang Author-email: honza.kral@gmail.com, nick@nicklang.com License: Apache-2.0 Location: C:\Python311\Lib\site-packages Requires: elastic-transport Required-by:
解决方案
问题出在Python客户端的参数处理逻辑:当拆分match/range/geo_match作为独立参数传递时,客户端会把这些参数和name一起打包成请求体发送给Elasticsearch,但Elasticsearch的Put Enrich Policy API要求name是URL路径参数,请求体中不能包含name字段。
正确的做法是直接传递完整的body参数,不需要拆分字段。修改后的代码如下:
if enrich_policies: for i, (name, body) in enumerate(enrich_policies.items()): result = es.enrich.get_policy(name=name) if "config" in body: body = body["config"] log_print(f"Putting policy {name} with body: {body}", "DEBUG") # 直接传递完整的body参数 result = es.enrich.put_policy(name=name, body=body) # execute enrich policy result = es.enrich.execute_policy(name=name)
说明
name作为路径参数传递,客户端会自动将其放入URL中,不会出现在请求体里- 完整的
body参数包含Enrich Policy的配置(如match/range等),符合Elasticsearch API的请求体格式要求
内容的提问来源于stack exchange,提问作者Lacrosse343
相关产品推荐
相关产品推荐

