Elasticsearch ScrollId不返回任何文档

时间:2018-01-22 11:22:11

标签: c# asp.net elasticsearch

我正面临一个与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.不明白为什么。

1 个答案:

答案 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;

这样,我得到了我想要的一切。