如何在Java Rest High Level Client中深度复制BoolQueryBuilder对象?
解决BoolQueryBuilder实例复制时的UnsupportedOperationException问题
你用writeTo+StreamInput构造函数复制BoolQueryBuilder的方式行不通,因为BoolQueryBuilder的带StreamInput参数的构造函数是给Elasticsearch内部的命名可写系统用的,直接调用会因为缺少必要上下文抛出异常。
给你两个可行的解决方案:
方案一:使用内置的copy()方法(推荐)
如果你的Elasticsearch版本是7.x及以上,BoolQueryBuilder已经提供了现成的复制方法,一行代码就能搞定:
BoolQueryBuilder pQuery = mQuery.copy();
方案二:手动复制所有子查询和参数
如果版本不支持copy()方法,就手动把原实例的各个部分复制到新实例中:
BoolQueryBuilder pQuery = QueryBuilders.boolQuery(); // 复制must子句 for (QueryBuilder mustQuery : mQuery.must()) { pQuery.must(mustQuery.copy()); } // 复制mustNot子句 for (QueryBuilder mustNotQuery : mQuery.mustNot()) { pQuery.mustNot(mustNotQuery.copy()); } // 复制should子句 for (QueryBuilder shouldQuery : mQuery.should()) { pQuery.should(shouldQuery.copy()); } // 复制filter子句 for (QueryBuilder filterQuery : mQuery.filter()) { pQuery.filter(filterQuery.copy()); } // 复制其他配置参数 pQuery.minimumShouldMatch(mQuery.minimumShouldMatch()); pQuery.boost(mQuery.boost()); // 其他需要保留的参数都可以按此方式复制
原来的序列化反序列化方法需要配合Elasticsearch的NamedWriteableRegistry完成,属于内部机制,不适合用来做实例复制。
内容的提问来源于stack exchange,提问作者Devesh pathak
相关产品推荐
相关产品推荐

