2017-12-11 1 views
0

Ich benutze elasticsearch mit Java-API, um Daten mit dem Scroll-Ansatz zu erhalten, und da ich eine Menge Daten habe ich versuche, die Daten per scrollId mit mehreren und nachfolgenden Anfragen zu paginieren.Erhalten Sie elasticsearch Daten durch scrollId in verschiedenen Anfragen

Beispiel:

Statt: POST http://localhost:8080/country

diese Rückkehr:

[ 
    { 
    scrollId: abc, 
    data: [{country: brazil}, {country: argentina}] 
    }, 
    { 
    scrollId: def, 
    data: [{country: france}, {country: germany}] 
    } 
] 

Ich mag würde verwenden: POST http://localhost:8080/country?paged=true

Mit dem ersten scrollId bei der Antwort:

{ 
    nextScrollId: abc 
} 

Dann kann ich einige Anfragen durchführen, während nextScrollId vorhanden:

POST http://localhost:8080/country?scrollId=abc

Rückkehr:

{ 
    nextScrollId: def, 
    data: [{country: brazil}, {country: argentina}] //data from the "abc" scrollId 
} 

Dann: POST http://.../data?scrollId=def

Rückkehr:

Derzeit bin ich mit diesem Stück Code:

SearchResponse scrollResponse = elastic.getDataFromElasticSearch(); 

boolean hasNext = true; 
String scrollId = request.getScrollId(); 
CountryResponse countryResponse = new CountryResponse(); 

do { 
    if (scrollResponse.getScrollId().equals(scrollId)) { 

    scrollResponse = client.prepareSearchScroll(scrollId) 
         .setScroll(TimeValue.timeValueMinutes(1)) 
         .execute() 
         .actionGet(); 

    //here i get the data from scrollResponse.getHits().getHits() 
    //and format it to that nextScrollId | data structure 
    countryResponse.addCountriesFromElasticSearchResponse(scrollResponse); 
    } else { 
    hasNext = false; 
    } 

} while (hasNext == true); 

countryResponse.setNextScrollId(scrollResponse.getScrollId()); 
return countryResponse; 

Damit kann ich die nächste scrollId richtig zurück.

Die Sache hier ist, dass wenn ich versuche, um die Daten zu erhalten, die Schriftrolle mit dem nextScrollId Vorbereitung, ich in der Antwort keine Daten einsehen.

Ist das möglich?

Antwort

0

Das Scroll API soll durch einen einzigen Faden in einer Art und Weise verbraucht wird. Intern wird ein Cursor erstellt, der sich nur vorwärts durch das Suchergebnis bewegt, wobei jeder Aufruf den Cursorzustand ändert und es unmöglich ist, denselben Aufruf zweimal für denselben Cursor zu wiederholen (scroll).

In Ihrem Fall ist das Problem zu verstehen, wie Scroll-intern arbeitet - die erste Seite kann nur durch den ersten Aufruf erhalten:

enter image description here

Um kundenspezifische Logik zu implementieren (in Frage beschrieben) mit Iterator verschoben

enter image description here

Sie die Suchergebnisse bei der ersten Anforderung cachen haben und halten (Cache), um sie auf Ihrem Server mit „Ihrer eigenen itera tor "zum ursprünglichen elastischen Iterator verschoben.Denken Sie auch daran, dass:

  • es unmöglich ist, ein Iterator zweimal anrufen
  • Iterator
  • ablaufen kann, wie Sie Service skalieren? Im Fall von wenigen Knoten Ihres Dienstes müssen Sie Anfragen für dieselbe Sitzung an denselben Knoten weiterleiten (sticky-Sitzung). Elastic hat einen eigenen Routing-Service und funktioniert sofort.

Also ich empfehle dringend eine elastic scroll API in der Weise zu verwenden, wie in der Dokumentation beschrieben.

Verwandte Themen