elasticsearch,serialization,Java,elasticsearch,Serialization" /> elasticsearch,serialization,Java,elasticsearch,Serialization" />

使用Java客户端的Elasticsearch查询序列化

使用Java客户端的Elasticsearch查询序列化,java,elasticsearch,serialization,Java,elasticsearch,Serialization,我正在使用官方ElasticsearchJava客户端。它工作得很好,但不幸的是,它的对象没有实现可序列化的接口。我特别需要序列化QueryBuilder的实例 我发现了两种使用客户端序列化对象的方法。其中之一是使用QueryBuilder.writeTo()。另一个是使用: Strings.toString(queryBuilder.toXContent(XContentFactory.jsonBuilder(),toXContent.EMPTY_参数)) 但在这两种情况下,我都找不到如何反

我正在使用官方ElasticsearchJava客户端。它工作得很好,但不幸的是,它的对象没有实现可序列化的接口。我特别需要序列化QueryBuilder的实例

我发现了两种使用客户端序列化对象的方法。其中之一是使用QueryBuilder.writeTo()。另一个是使用:

Strings.toString(queryBuilder.toXContent(XContentFactory.jsonBuilder(),toXContent.EMPTY_参数))
但在这两种情况下,我都找不到如何反序列化对象


另外,我不确定这是否是解决任务的最佳方法。

最后,我得到了以下代码:

序列化:

//使用源代码包装查询以反序列化任何类型的查询
SearchSourceBuilder query=新建SearchSourceBuilder().query(this.query);
String sourceJson=Strings.toString(查询);
反序列化:

私有静态最终名称dxContentRegistry xContentRegistry;
静止的{
搜索模块搜索模块=
新的SearchModule(Settings.EMPTY、false、Collections.emptyList());
xContentRegistry=
新的NamedXContentRegistry(searchModule.getNamedXContents());
}
...
XContentParser解析器=
XContentType.JSON.xContent().createParser(xContentRegistry,
LoggingDeprecationHandler.INSTANCE,
sourceJson);
SearchSourceBuilder sourceBuilder=SearchSourceBuilder.fromXContent(解析器);
this.query=sourceBuilder.query();
因此,您可以将此代码添加到
readObject()
writeObject()
方法中,为ES查询对象提供(反)序列化


使用Elasticsearch 7.5.1客户端库实现。

为什么要这样做?@GhostCat我需要它使用切片滚动将数据从ES拉入Apache Flink节点-它需要可序列化的查询。