Elasticsearch 可以流式传输 SearchResponse 吗?
Posted
技术标签:
【中文标题】Elasticsearch 可以流式传输 SearchResponse 吗?【英文标题】:Can Elasticsearch stream the SearchResponse? 【发布时间】:2015-05-05 21:04:44 【问题描述】:我有一个可以从 Elasticsearch 导出一些报告数据的 rest 应用程序。使用 Java API 很容易做到:
SearchResponse response = getClient()
.prepareSearch("my_index_name")
.setQuery(QueryBuilders.someQuery())
.addAggregation(AggregationBuilders.someAggregation())
.get();
问题始于大反应。使用此代码 sn-p,读取响应以在内存中构建 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
吗?
【问题讨论】:
【参考方案1】:proposal for streaming results 确实存在,但到目前为止它似乎还没有恢复活力并且已经关闭(暂时)。
有一种方法可以使用 XContentBuilder
来实现,但这仍然需要在发送之前将整个响应保存在内存中。
这可能不是您想要的,但这是我所知道的最接近您需要的东西。值得一试。
【讨论】:
【参考方案2】:我相信没有办法从 Java API 获得InputStream
(但我可能错了)。我也认为没有办法在Jest(基于REST的Elasticsearch Java API)中直接获取InputStream
。
您提到自己创建对_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
【讨论】:
以上是关于Elasticsearch 可以流式传输 SearchResponse 吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从 USB 摄像头流式传输视频和从移动麦克风传输音频以在 android 中进行 RTMP 流式传输
视频文件不使用 MPMoviePlayerController 流式传输?