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 流式传输?

是否可以在 iPhone 上流式传输 mms、ASX、RTSP 流?

您可以通过蓝牙实时流式传输相机吗?

在 Mac 上流式传输音频

我可以将 iOS 应用程序视图流式传输到 Chromecast