Elasticsearch报错:'PerTypeValues`1'类型初始值设定项引发异常
Elasticsearch 错误排查:'PerTypeValues`1' 类型初始值设定项引发异常
问题场景
执行Elasticsearch的UpdateByQuery操作时触发错误:The type initializer for 'PerTypeValues1' threw an exception`,相关代码如下:
CustomLogWrite.WriteLog("Viewed canidates Inside "); UpdateByQueryResponse resp = Client.UpdateByQuery<CandidateInfoEs>(s => s .Query(q => q.Terms(c => c.Field(p => p.RCandidateId).Terms(CandidatesID))) .Script(script => script .Source("if (ctx._source.ViewedFromPositions == null) { ctx._source.ViewedFromPositions = new ArrayList(); } ctx._source.ViewedFromPositions.add(params.id);") .Params(p => p.Add("id", positionID))) .Conflicts(Conflicts.Proceed) .Refresh(true) );
排查与解决办法
1. 匹配NEST客户端与ES服务端版本
这是引发该异常的最常见原因,PerTypeValues类的初始化异常大多源于客户端和服务端版本不兼容:
- 确认你的NEST NuGet包版本与Elasticsearch服务端版本完全一致(主、次、修订版本都要对应),比如服务端是7.17.6,客户端必须安装7.17.6版本的NEST。
- 重新安装对应版本的NEST包:
Uninstall-Package NEST Install-Package NEST -Version 你的ES服务端版本号
2. 修正实体类字段映射
CandidateInfoEs类中ViewedFromPositions字段的定义可能与ES中的字段类型不匹配,导致序列化失败:
- 将该字段定义为泛型集合类型,比如
List<string>,确保和ES中的数组类型对应:public List<string> ViewedFromPositions { get; set; } - 避免使用非泛型集合(如ArrayList),减少序列化时的类型转换冲突。
3. 优化Painless脚本语法
脚本中的ArrayList初始化可能存在兼容性问题,替换为Painless推荐的写法:
- 将脚本中的
new ArrayList()改为[],简化列表初始化:if (ctx._source.ViewedFromPositions == null) { ctx._source.ViewedFromPositions = []; } ctx._source.ViewedFromPositions.add(params.id); - 或者明确指定泛型类型:
new ArrayList<String>()
4. 检查客户端初始化配置
确保Elasticsearch客户端的初始化逻辑正确:
- 客户端实例应采用单例模式,避免多线程下重复初始化导致的资源冲突。
- 验证连接配置中的节点地址、认证信息是否正确,确保客户端能正常与ES集群通信。
内容的提问来源于stack exchange,提问作者Code Noob
相关产品推荐
相关产品推荐

