Elasticsearch可以流式传输SearchResponse吗?

时间:2015-03-04 18:15:56

标签: java performance elasticsearch stream inputstream

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

SearchResponse response = getClient()
            .prepareSearch("my_index_name")
            .setQuery(QueryBuilders.someQuery())
            .addAggregation(AggregationBuilders.someAggregation())
            .get();

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

分页无法提供帮助,因为我们经常需要返回完整数据和聚合do not support paging yet

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

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

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

2 个答案:

答案 0 :(得分:1)

确实存在proposal for streaming results但是到目前为止它似乎没有吸收并且已关闭(暂时)。

有一种方法可以使用XContentBuilder,但仍需要在发送之前将整个响应放在内存中。

它可能不是你想要的,但这是我所知道的最接近你需要的东西。值得一试。

答案 1 :(得分:0)

我相信没有办法从Java API中获取InputStream(但我可能错了)。我还认为无法在Jest(基于REST的Elasticsearch Java API)中直接获取InputStream

你提到自己创建搜索请求到_search端点很麻烦:如果你指的是构建实际的json查询,我只想指出一旦你有{{{ 1}},您可以在其上调用SearchSourceBuilder以获得查询的完全有效的json表示。

toString()