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

3

我正在使用Java的官方Elasticsearch客户端。它运行良好,但不幸的是它的对象没有实现Serializable接口。我需要特别序列化QueryBuilder的实例。

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

Strings.toString(queryBuilder.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS))

但我找不到如何在这两种情况下进行反序列化对象的方法。

另外,我不确定这是否是解决问题的最佳方式


你为什么想要这样做? - GhostCat
1
@GhostCat 我需要它使用切片滚动从ES中提取数据到Apache Flink节点,这需要可序列化的查询。 - viator
我的使用案例是缓存生成需要很大努力的ES查询。 - rudi
1个回答

3

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

序列化:

// wrap query with source to deserialize any type of query
SearchSourceBuilder query = new SearchSourceBuilder().query(this.query);

String sourceJson = Strings.toString(query);

反序列化:

private static final NamedXContentRegistry xContentRegistry;

static {
    SearchModule searchModule =
        new SearchModule(Settings.EMPTY, false, Collections.emptyList());

    xContentRegistry =
        new NamedXContentRegistry(searchModule.getNamedXContents());
}

...

XContentParser parser =
        XContentType.JSON.xContent().createParser(xContentRegistry,
                                                  LoggingDeprecationHandler.INSTANCE,
                                                  sourceJson);

SearchSourceBuilder sourceBuilder = SearchSourceBuilder.fromXContent(parser);

this.query = sourceBuilder.query();

因此,您可以将此代码添加到readObject()writeObject()方法中,以提供ES查询对象的(反)序列化。

使用Elasticsearch 7.5.1客户端库实现。


运行得非常好。您还可以避免通过SearchSourceBuilder进行绕路,而使用AbstractQueryBuilder.parseInnerQueryBuilder(parser)进行反序列化。 - rudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接