我有一个可以从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
吗?
答案 0 :(得分:1)
确实存在proposal for streaming results但是到目前为止它似乎没有吸收并且已关闭(暂时)。
有一种方法可以使用XContentBuilder
,但仍需要在发送之前将整个响应放在内存中。
它可能不是你想要的,但这是我所知道的最接近你需要的东西。值得一试。
答案 1 :(得分:0)
我相信没有办法从Java API中获取InputStream
(但我可能错了)。我还认为无法在Jest(基于REST的Elasticsearch Java API)中直接获取InputStream
。
你提到自己创建搜索请求到_search
端点很麻烦:如果你指的是构建实际的json查询,我只想指出一旦你有{{{ 1}},您可以在其上调用SearchSourceBuilder
以获得查询的完全有效的json表示。
toString()