Elasticsearch可以流式传输SearchResponse吗?

Mik*_*ias 5 java performance inputstream stream elasticsearch

我有一个可以从Elasticsearch导出一些报告数据的休息应用程序.使用Java API很容易:

SearchResponse response = getClient()
            .prepareSearch("my_index_name")
            .setQuery(QueryBuilders.someQuery())
            .addAggregation(AggregationBuilders.someAggregation())
            .get();
Run Code Online (Sandbox Code Playgroud)

问题始于大反应.使用此代码片段,将读取响应以SearchResponse在内存中构建对象.在我的情况下,响应不适合内存.

分页无法帮助,因为我们经常需要返回完整数据,而Aggregations 还不支持分页.

我知道我可以使用Elasticsearch REST API将响应作为流读取,但是手动构建请求会很麻烦.我真的想要这样的东西:

// my dream API
InputStream response = getClient()
            .prepareSearch("my_index_name")
            .setQuery(QueryBuilders.someQuery())
            .addAggregation(AggregationBuilders.someAggregation())
            .getStream();
Run Code Online (Sandbox Code Playgroud)

那么,Elasticsearch Java API流可以SearchResponse吗?

mic*_*mia 0

我相信没有办法InputStream从 Java API 获取 an(但我可能是错的)。我还认为没有办法直接获取InputStreamJest 基于REST的Elasticsearch Java API)。

您提到自己创建对端点的搜索请求很麻烦_search:如果您指的是构建实际的 json 查询,我只是想指出,一旦您有了SearchSourceBuilder,您可以调用toString()它来获取完整的您的查询的工作 json 表示形式。

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(this.getQuery())
            .from(this.getFrom())
            .size(this.getSize())
            .fetchSource(this.getSource(), null);
    this.getSort().forEach(sourceBuilder::sort);
    sourceBuilder.toString() // the json representation
Run Code Online (Sandbox Code Playgroud)