2015-07-09 26 views
7

Örnekler Elastic Search sonuçlarından tüm belgeleri almak için .From() ve .Size() yöntemlerini kullanıyorum. Örnekte ElasticSearch NEST API

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

Son zamanlarda ben Elastik Arama kaydırma özelliği rastladım -

Aşağıda örnek bir örnektir. Bu özellikle büyük verileri almak için From() ve Size() yöntemlerinden daha iyi bir yaklaşımdır.

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

ben Nükleer Tehlike API Kaydırma özelliğini örneğin arıyorum.

Birisi lütfen NEST örneğini sağlayabilir mi?

sayesinde ANDAE Reindex ait Sameer

cevap

4

İç kurulması bir dizinden belgeleri taşımak için kaydırma kullanır.

İyi bir başlangıç ​​noktası olmalıdır. github adresinden

kod için ilginç bulabilirsiniz.

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()); 

Ayrıca

[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

Scroll teşekkür ederiz için integration test bir göz alabilir. Toplama sorgusu sorgu tipi ile 'tarama' desteklenmiyor. 'Tarama' arama türü olmadan Scroll kullanmak hala iyi mi? –

+0

Evet, ancak kaydırma daha az etkili olacak https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html#scan-scroll. Kullanım durumunuza göre değişir. – Rob

İlgili konular