NEST 7.6.2序列化SearchRequest出现重复aggs聚合字段如何处理
问题说明
使用NEST 7.6.2对接同版本Elasticsearch时,构造如下查询请求:
var searchRequest = new SearchRequest() { Aggregations = new AggregationDictionary() { } };
调用elasticClient.RequestResponseSerializer.SerializeToString(searchRequest)方法序列化请求对象,得到如下结果:
{"aggs":{},"aggregations":{}}
聚合配置节点重复出现两次。
问题性质
该现象属于NEST 7.6.2版本的序列化小缺陷,不属于业务代码编写错误。
NEST内部为了兼容Elasticsearch不同版本的参数命名规则,同时支持aggregations全称和aggs简写两个参数名,在Aggregations属性被赋值为空字典的场景下,序列化逻辑没有做同语义字段的互斥判断,导致两个键被同时输出。
该冗余字段不会影响Elasticsearch的正常请求处理,服务端解析时会识别两个键的同语义性,不会抛出格式错误,仅存在序列化内容冗余的问题。
处理方式
- 无特殊格式要求可直接忽略
重复字段不会干扰ES的请求执行,不需要额外调整代码即可正常使用。 - 升级NEST版本修复
升级NEST到7.10及以上的7.x稳定版本,官方已在后续迭代中修复了空聚合字典场景下的重复字段序列化问题。 - 低版本无升级场景下的规避写法
不需要配置聚合规则时,不要给Aggregations属性赋值空AggregationDictionary对象,保持该属性为null即可,序列化时不会生成聚合相关节点,也就不会出现重复问题。无聚合需求的请求构造示例:
如果需要配置聚合规则,只要向var searchRequest = new SearchRequest() { // 仅配置查询、分页等其他必要参数,不对Aggregations属性赋值 };AggregationDictionary中添加至少一个有效聚合项,序列化时也不会触发重复字段的问题。
内容的提问来源于stack exchange,提问作者Cem Tuğut
相关产品推荐
相关产品推荐

