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



我使用以下代码循环/滚动弹性搜索框中的所有文档:

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

出于某种原因,循环响应比预期更早为空 - 即滚动完成。有人能看到我的代码存在根本性问题吗?谢谢!

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

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

或者根据源代码,您可以使用时间单位(微米、纳米、毫秒、秒、米、小时和德(:

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

最新更新