ES 通过查询更新某个字段,Error 500 (Internal Server Error)

问题描述:

项目中通过查询ES中某个字段,并更新某个值的字段,当量比较大的时候报错:

upsert associated failed: elastic: Error 500 (Internal Server Error): Failed to compile inline script [ctx._source.pcap_filename = ] using lang [painless] [type=general_script_exception]

问题解析:

  1. 通过查询某个字段并更新这条数据中某个值的时候,如果是通过Script的方式更新,需要先阅读ES的官方Script撰写界面:How to write scripts | Elasticsearch Guide [8.11] | Elastic

  2. 我是使用硬编码的方式直接撰写的ES的script,我写的代码(Go),

Go 复制代码
script := "ctx._source.pcap_filename = '" + fileName + "'"

fileName 是一个变量,script 在编译的时候直接就硬编码,所以每一次更新的时候都要重新compile这个script,当量比较大的时候,就超过下面如图所示的限制了。ES的script是有次数限制的,当你触发先至的时候,就会报这个错误

  1. 问题解决方式:

通过官方script 介绍的方式,

Go 复制代码
script := "ctx._source.pcap_filename = params['fileName']"

通过上面的方式写,每次script都是一样的,但是params不一样,就不用es重新编译这个script,直接在script 中的cache中取出已经编译的script,替换param中的数据就可以了。

通过参数的方式进行传递,在go中

Go 复制代码
res, err := es.client.UpdateByQuery().Index(index).Query(match_query).
		Script(elastic.NewScript(script).Param("fileName", fileName)).Do(es.ctx)

使用上面的代码,查询、撰写script,并且设置参数fileName。

这样应该就不会报这个错误了。

其余参考网站:1. https://github.com/elastic/elasticsearch-net/issues/29612

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html

  2. Understanding and fixing "too many script compilations" errors in Elasticsearch

相关推荐
isNotNullX5 分钟前
kettle好用吗?相较于国产ETL工具有哪些优劣之处?
大数据·数据库·数据仓库·信息可视化·etl
说私域36 分钟前
开源AI大模型AI智能名片S2B2C商城小程序源码赋能下的“信息找人”:人工智能时代的精准零售场景
大数据·人工智能·小程序·开源·零售
G皮T1 小时前
【Elasticsearch】文档迁移(Reindex)
大数据·elasticsearch·搜索引擎·全文检索·文档·reindex·文档迁移
安大小万1 小时前
Git的命令大全
大数据·git·elasticsearch·团队开发·个人开发
璞华Purvar2 小时前
2025年全国技术贸易创新实践案例:AI编辑助手平台助力“一带一路”数字媒体产业高质量发展
大数据·人工智能·媒体
麓殇⊙2 小时前
操作系统期末复习--操作系统初识以及进程与线程
java·大数据·数据库
大师兄带你刨AI2 小时前
「AI大数据」| 《华为:面向智能制造的工业大模型标准化研究报告》
大数据·人工智能
Elastic 中国社区官方博客3 小时前
使用 Elasticsearch 提升 Copilot 能力
大数据·数据库·elasticsearch·搜索引擎·全文检索·copilot·mcp
F36_9_3 小时前
如何高效实现公司文件管理
大数据·数据库·人工智能
onceco4 小时前
使用duckduckgo_search python api 进行免费且不限次数的搜索
开发语言·python·搜索引擎