我试图理解为什么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.我假设将返回滚动的下一批。
我认为我做错了,因为我认为这更像是一种分页流程。
答案 0 :(得分:1)
这不是Scroll API的工作方式。
.Search<T>()
(或SearchAsync<T>()
),指定.Scroll()
时间。响应将包含第一组文档.Scroll<T>
(或ScrollAsync<T>()
),传入上一个请求的滚动ID,以及滚动时间以保持滚动在Elasticsearch上打开。循环发送滚动请求,直到响应不包含任何文档。