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

Elasticsearch Python客户端v7.15遇runtime_mappings未知键错误

错误原因及修复方案

1. 请求结构错误(核心触发报错的原因)

在Elasticsearch Python客户端v7.15版本中,runtime_mappings不能作为search()方法的顶级参数直接传入,必须嵌套在body参数的字典中。如果直接把runtime_mappings当作独立参数传递给search(),就会触发Unknown key for a START_OBJECT in [runtime_mappings]错误。

正确的调用示例:

from elasticsearch import Elasticsearch

es = Elasticsearch("你的ES地址:端口")

search_body = {
    "runtime_mappings": {
        "tag_dynamic": {
            "type": "keyword",
            "script": {
                "source": """
String nowString = params['now'];
ZonedDateTime nowZdt = ZonedDateTime.parse(nowString);
long now = nowZdt.toInstant().toEpochMilli();
ZonedDateTime mtimeZdt = ZonedDateTime.parse(doc['m_time']);
long millisDateTime = mtimeZdt.toInstant().toEpochMilli();
// 计算当前时间与m_time的间隔
long mtime_elapsed = now - millisDateTime;
// 计算30天前的时间戳
ZonedDateTime zdtMinus = nowZdt.minusDays(30);
long thirty_days_ago = zdtMinus.toInstant().toEpochMilli();
// 计算30天对应的毫秒数
long thirty_days_millis = now - thirty_days_ago;

if (mtime_elapsed > thirty_days_millis) {
    emit('TOARCHIVE');
}
""",
                "params": {"now": "<生成的ISO-8601格式时间字符串>"}
            }
        }
    },
    "query": {"query_string": {"query": "m_time:*"}}
}

# 必须将完整请求体传入body参数
response = es.search(index="你的索引名", body=search_body)

2. Painless脚本的语法问题

你的脚本里还有两处错误,即使结构修正后也会导致执行失败:

  • 重复定义变量Mtime_elapsedTime:Painless不允许同一作用域内重复声明同名变量,需要重命名其中一个(示例中改为mtime_elapsed和thirty_days_millis)。
  • 未定义变量3d0_elapsedTime:该变量不存在,需替换为实际要比较的30天间隔毫秒数变量。

内容的提问来源于stack exchange,提问作者Alex Cornec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:55:36