使用 NEST 和 C# 进行弹性搜索滚动

Elastic Search scrolling with NEST and C#

我正在使用以下代码 loop/scroll 我的弹性搜索框中的所有文档:

const string indexName = "bla";
var client = GetClient(indexName);
const int scrollTimeout = 1000;

var initialResponse = client.Search<Document>
    (scr => scr.Index(indexName)
    .From(0)
    .Take(100)
    .MatchAll()
    .Scroll(scrollTimeout))
;

List<XYZ> results;
results = new List<XYZ>();

if (!initialResponse.IsValid || string.IsNullOrEmpty(initialResponse.ScrollId))
throw new Exception(initialResponse.ServerError.Error.Reason);

if (initialResponse.Documents.Any())
results.AddRange(initialResponse.Documents);

var scrollid = initialResponse.ScrollId;
bool isScrollSetHasData = true;
while (isScrollSetHasData)
{
    var loopingResponse = client.Scroll<XYZ>(scrollTimeout, scrollid);

    if (loopingResponse.IsValid)
    {
        results.AddRange(loopingResponse.Documents);
        scrollid = loopingResponse.ScrollId;
    }
    isScrollSetHasData = loopingResponse.Documents.Any();

    // do some amazing stuff
}

client.ClearScroll(new ClearScrollRequest(scrollid));

出于某种原因,loopingResponse 比预期更快地为空 - 即滚动完成。有人能看出我的代码有什么根本性的错误吗?谢谢!

查看您的代码,我认为 scrollTimeout 可能是问题所在。通常滚动用于要返回的大块数据,1000 毫秒不足以让搜索上下文在请求之间保持活动状态。您可以尝试将它增加到几分钟以找到最适合您情况的数字:

var scrollTimeout = new Time(TimeSpan.FromMinutes(3));

或者根据 source code,您可以使用时间单位(微米、纳米、毫秒、秒、米、小时和 d):

var response = client.Search<Document>(scr => scr.Index(indexName)
    ...
    .Scroll("3m")
    );