You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:16:13