我正面临一个与Elastisearch和滚动有关的奇怪问题。我正在尝试从索引中获取50条192条记录,但scrollId
返回0,因此我的循环不会执行。有我的代码:
var results = new List<MyModelList>();
var scanResults = client.Search<MyModel>(s => s
.Index("myindex")
.Type("MyIndexType")
.From(0)
.Size(2000)
.Query(q => q.QueryString(qs => qs.Query(query)))
.Scroll("5m")
);
var resultsscroll = client.Scroll<MyModel>("10m", scanResults.ScrollId);
while (resultsscroll.Documents.Any())
{
foreach (var doc in results)
{
results.Add(doc);
}
resultsscroll = client.Scroll<MyModel>("10m", resultsscroll.ScrollId);
}
return results;
在设置断点时,我可以看到scanResults
设置为2000,但接下来,resultsscroll
为0.我做错了什么?遵循官方文档,并进行一些搜索,似乎每个人都这样使用它。如果某人知道为什么它不起作用那就太好了。
你会看到我已删除:
.SearchType(Nest.SearchType.Scan)
从我的查询中,因为如果我让它,scanResults
设置为0.不明白为什么。
答案 0 :(得分:1)
这是如何解决我的问题(也是在Aman的要求)。
//Settings
var maxQuery = 50000;
//Connection
var client = ConnectElasticClient();
//Prepare Result
var results = new List<ModelDL>();
var countHits = (int)client.Search<Model>(s => s.Index("MyIndex").Type("MyType")
.Query(q => q.QueryString(qs => qs.Query(query)))).Total;
//First Query
var response =
client.Search<Model>(s => s.Index("MyIndex").Type("MyType").Size(maxQuery)
.Query(q => q.QueryString(qs => qs.Query(query))));
if (countHits <= maxQuery)
{
return results;
}
var cpt = maxQuery;
for (var i = 0; i < ((countHits - maxQuery) / maxQuery); i++)
{
var res =
client.Search<Model>(s => s.Index("MyIndex").Type("MyType").From(cpt).Size(maxQuery)
.Query(q => q.QueryString(qs => qs.Query(query))));
cpt += maxQuery;
results.AddRange(res.Documents.Select(x => new EntrepriseSireneDL(x)));
}
var lastScrollSize = countHits - cpt;
var r =
client.Search<Model>(s => s.Index("MyIndex").Type("MyType").From(cpt).Size(lastScrollSize)
.Query(q => q.QueryString(qs => qs.Query(query))));
results.AddRange(r.Documents.Select(x => new ModelDL(x)));
return results;
这样,我得到了我想要的一切。