2015-03-04 23 views
5

Ho un'applicazione di riposo in grado di esportare alcuni dati di report da Elasticsearch. È facile da fare con l'API Java:Elasticsearch può eseguire lo streaming di SearchResponse?

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

Il problema inizia con le grandi risposte. Utilizzando questo snippet di codice, la risposta viene letta per creare l'oggetto SearchResponse in memoria. Nel mio caso, la risposta non si adatta alla memoria.

Il paging non può essere d'aiuto perché spesso è necessario restituire i dati completi e Aggregations do not support paging yet.

So che posso utilizzare l'API REST Elasticsearch per leggere la risposta come flusso, ma creare manualmente la richiesta è ingombrante. Voglio davvero qualcosa di simile:

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

Quindi, può trasmettere l'API Java elasticsearch il SearchResponse?

risposta

0

Credo non ci sia modo di ottenere un InputStream dall'API Java (ma potrei sbagliarmi). Ritengo inoltre che non sia possibile ottenere direttamente uno InputStream in Jest (un'API Elasticsearch Java basata su REST).

Lei ha accennato che è ingombrante per creare la richiesta di ricerca al _search endpoint da soli: se ti riferisci a costruire la query effettiva JSON, Vorrei solo far notare che una volta che hai un SearchSourceBuilder, è possibile chiamare toString() su di esso per ottenere una rappresentazione json completamente funzionante della tua query.

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

Un proposal for streaming results esiste, ma non sembra aver raccolto a vapore fino ad ora ed è stato chiuso (per ora).

C'è un modo per farlo con XContentBuilder ma che richiede comunque che l'intera risposta sia in memoria prima di essere inviata.

Potrebbe non essere quello che vuoi, ma questa è la cosa più vicina che io conosca che possa soddisfare il tuo bisogno. Vale la pena provarlo.