Elasticsearch.net - NEST Scroll不断返回相同的结果

时间:2017-02-07 17:40:04

标签: .net elasticsearch scroll nest

我试图理解为什么elasticsearch.net NEST滚动调用会保持返回相同的结果。我的C#应用​​程序中有一个外部循环,它跟踪当前页面并将其与批量大小一起传入。我简化了代码:

List<int> ids = GetIds();
int count = _batchSize;
int currentPage = 0;

while (count == _batchSize)
{
    var results = Execute(client => client.Search<Invoice>(s => s
                .Index(indexName)
                .Query(q => q
                .Terms(n => n
                .Field(f => f.Items.FirstOrDefault().MyInformation.FirstOrDefault().ItemID)
                .Terms(ids)))
                .Size(batchSize)
                .From(currentPage * batchSize)
                .Scroll("1m")
           ));

    DoSomethingWithResults();
    count = results.Count();
    currentPage++;
}

在上面的调用中,id列表是嵌套元素的id与它们包含在内的对象的一对多关系。这就是我想使用滚动的原因,因为我不知道会返回多少个Invoice对象。每次调用currentPage都会增加1.我假设将返回滚动的下一批。

我认为我做错了,因为我认为这更像是一种分页流程。

1 个答案:

答案 0 :(得分:1)

这不是Scroll API的工作方式。

  1. 首先请求.Search<T>()(或SearchAsync<T>()),指定.Scroll()时间。响应将包含第一组文档
  2. 后续请求是.Scroll<T>(或ScrollAsync<T>()),传入上一个请求的滚动ID,以及滚动时间以保持滚动在Elasticsearch上打开。循环发送滚动请求,直到响应不包含任何文档。
  3. 查看this answer for an example