2015-03-04 9 views
5

Ich habe eine Rest-Anwendung, die einige Berichtsdaten aus Elasticsearch exportieren kann. Es ist leicht, mit dem Java-API zu tun:Kann Elasticsearch die SearchResponse streamen?

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

Das Problem mit den großen Antworten beginnt. Mit diesem Codeschnipsel wird die Antwort gelesen, um das Objekt SearchResponse im Speicher zu erstellen. In meinem Fall passt die Antwort nicht in den Speicher.

Paging kann nicht helfen, da wir häufig die vollständigen Daten und Aggregationen do not support paging yet zurückgeben müssen.

Ich weiß, dass ich die Elasticsearch-REST-API verwenden kann, um die Antwort als Stream zu lesen, aber manuell erstellen Sie die Anfrage ist es mühsam. Ich möchte wirklich so etwas wie dieses:

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

So kann die Elasticsearch Java API den SearchResponse streamen?

Antwort

0

Ich glaube, es gibt keine Möglichkeit, eine InputStream von der Java-API zu erhalten (aber ich könnte falsch liegen). Ich denke auch, dass es keine Möglichkeit gibt, eine InputStream in Jest (eine REST-basierte Elasticsearch Java API) direkt zu erhalten.

Sie erwähnen, dass es mühsam ist, die Suchanfrage an den _search Endpunkt selbst zu erstellen: Wenn Sie die tatsächliche json Abfrage zum Aufbau Bezug bist, ich möchte nur darauf hinweisen, dass, sobald Sie eine SearchSourceBuilder haben, können Sie anrufen toString() darauf, um eine voll funktionsfähige JSON-Darstellung Ihrer Abfrage zu erhalten.

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 
1

A proposal for streaming results existiert, aber es scheint nicht Dampf abgeholt bisher und wurde geschlossen (bis jetzt).

Es gibt einen Weg, es mit XContentBuilder zu tun, aber das erfordert immer noch, dass die gesamte Antwort im Speicher ist, bevor sie gesendet wird.

Es könnte nicht sein, was Sie wollen, aber das ist die nächste Sache, die ich weiß, die Ihre Bedürfnisse erfüllen könnte. Es lohnt sich, es auszuprobieren.