2015-07-09 9 views
7

Używam metod .From() i .Size() do pobierania wszystkich dokumentów z wyników Elastic Search.Przewiń przykład w ElasticSearch NEST API

Poniżej przykładowy przykład -

ISearchResponse<dynamic> bResponse = ObjElasticClient.Search<dynamic>(s => s.From(0).Size(25000).Index("accounts").AllTypes().Query(Query)); 

Ostatnio natknąłem funkcji przewijania Elastic Search. Ta metoda wygląda lepiej niż metody From() i Size(), aby pobrać duże dane.

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

I patrząc na przykład na funkcję przewijania w gniazdo API.

Czy ktoś może podać przykład NEST?

Dzięki Sameer

Odpowiedz

4

Wewnętrzne wdrożenie NEST Reindex wykorzystuje zwój przenieść dokumenty z jednego indeksu do drugiego.

To powinien być dobry punkt wyjścia.

Poniżej możesz znaleźć interesujący Cię kod z github.

var page = 0; 
var searchResult = this.CurrentClient.Search<T>(
    s => s 
     .Index(fromIndex) 
     .AllTypes() 
     .From(0) 
     .Size(size) 
     .Query(this._reindexDescriptor._QuerySelector ?? (q=>q.MatchAll())) 
     .SearchType(SearchType.Scan) 
     .Scroll(scroll) 
    ); 
if (searchResult.Total <= 0) 
    throw new ReindexException(searchResult.ConnectionStatus, "index " + fromIndex + " has no documents!"); 
IBulkResponse indexResult = null; 
do 
{ 
    var result = searchResult; 
    searchResult = this.CurrentClient.Scroll<T>(s => s 
     .Scroll(scroll) 
     .ScrollId(result.ScrollId) 
    ); 
    if (searchResult.Documents.HasAny()) 
     indexResult = this.IndexSearchResults(searchResult, observer, toIndex, page); 
    page++; 
} while (searchResult.IsValid && indexResult != null && indexResult.IsValid && searchResult.Documents.HasAny()); 

Ponadto można spojrzeć na integration test dla Scroll

[Test] 
public void SearchTypeScan() 
{ 
    var scanResults = this.Client.Search<ElasticsearchProject>(s => s 
     .From(0) 
     .Size(1) 
     .MatchAll() 
     .Fields(f => f.Name) 
     .SearchType(SearchType.Scan) 
     .Scroll("2s") 
    ); 
    Assert.True(scanResults.IsValid); 
    Assert.False(scanResults.FieldSelections.Any()); 
    Assert.IsNotNullOrEmpty(scanResults.ScrollId); 

    var results = this.Client.Scroll<ElasticsearchProject>(s=>s 
     .Scroll("4s") 
     .ScrollId(scanResults.ScrollId) 
    ); 
    var hitCount = results.Hits.Count(); 
    while (results.FieldSelections.Any()) 
    { 
     Assert.True(results.IsValid); 
     Assert.True(results.FieldSelections.Any()); 
     Assert.IsNotNullOrEmpty(results.ScrollId); 
     var localResults = results; 
     results = this.Client.Scroll<ElasticsearchProject>(s=>s 
      .Scroll("4s") 
      .ScrollId(localResults.ScrollId)); 
     hitCount += results.Hits.Count(); 
    } 
    Assert.AreEqual(scanResults.Total, hitCount); 
} 
+0

Dziękuję. Z zapytaniem o agregację typu "skanowanie" nie jest obsługiwane. Czy nadal dobrze jest używać Przewiń bez wyszukiwania "skanuj"? –

+0

Tak, ale przewijanie będzie mniej skuteczne https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html#scan-scroll. Zależy od twojego przypadku użycia. – Rob

Powiązane problemy