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
相关产品推荐
相关产品推荐

