搜索整个文档:使用C#和Elasticsearch的NEST

3

我想使用Nest在Elasticsearch中查询一百万个文档。我的代码:

var response = client.Search<MyObject>(s => s
          .Index("test")
          .Type("one")
          .Query(q => q.
                Term(
                    t => t.name, "A"
                )
          )
          .Size(10000)
          .Scroll("10m")
          .Pretty()
        );

我的MyObject类:

public class MyObject
    {
        public int id { get; set; }
        public int age { get; set; }
        public string lastname { get; set; }
        public string name { get; set; }
    }

问题在于当这个查询在前 10000 个文档中没有找到时,它将不会继续搜索其余的结果滚动 API。
我的问题是如何实现这一点(即在 Scroll API 中遍历整个页面,即使没有命中)?

var response = client.Search<MyObject>(search string, new SearchUrlParameters { Pretty = true }); 替换此查询。 - silambarasan vediappan
@silambarasanvediappan 你确定吗?默认情况下,Elastic 只启用了10000个文档! - Hassan Shaitou
我使用滚动API来处理每页10k的数据... - Hassan Shaitou
兄弟,我的问题是如何在ScrollAPI中循环查询页面,即使有空的hits...(不认为从(0)开始会解决问题)...但还是谢谢你的帮助 :) - Hassan Shaitou
1
哦!太好了。这是因为术语查询找到了搜索字符串的确切术语。 - silambarasan vediappan
显示剩余5条评论
1个回答

5
查询将搜索所有文档,但仅返回前.Size个文档。您可以使用.From().Size()分页结果,但是在分页超过一百万个文档时,深度分页可能会成为问题。为此,最好使用滚动API以有效地检索100万个文档。NEST具有可观察的帮助程序ScrollAll()来协助完成此操作。
var client = new ElasticClient();

// number of slices in slice scroll
var numberOfSlices = 4;

var scrollObserver = client.ScrollAll<MyObject>("1m", numberOfSlices, s => s
    .MaxDegreeOfParallelism(numberOfSlices)
    .Search(search => search
        .Index("test")
        .Type("one")
        .Term(t => t.name, "A")
    )
).Wait(TimeSpan.FromMinutes(60), r =>
{
    // do something with documents from a given response.
    var documents = r.SearchResponse.Documents;
});

只是像silambarsan说的那样将字母“A”更改为“a”,它对我起作用了。你想要做什么?将每个页面切成4个部分吗?然后搜索与新页面相同的部分? - Hassan Shaitou
1
我知道这很老了,但我正在使用ScrollAll,并需要获取包含在响应中的总结果。我尝试过TrackTotalHits,但那只返回每个切片的总数。有没有一个好的内置方法来做到这一点? - TheDoc
@RussCam 这个 ScrollAllSearchAfter 有什么不同?对于大数据集,它们在性能方面有什么区别?除了 这里这里,我还能在哪里找到 SearchAfter 的工作示例? - Florin Vîrdol
1
@FlorinVîrdol 最好作为一个新问题来询问。实际上,“ScrollAll”是滚动API的可观察实现,这是一种以游标方式向前检索大量文档的高效方法。它需要在服务器端跟踪滚动位置,因此不建议同时运行数千个滚动,并在滚动开始时返回文档。 - Russ Cam
1
@FlorinVîrdol 在程序设计中,“SearchAfter”是一种高效获取文档的方式,不需要在服务器端进行跟踪,并且可用于下一页/上一页的深度分页。对文档的视图是每个“search after”请求实时的,所以如果新添加的文档位于当前文档窗口之前,它可能会返回重复的文档。 - Russ Cam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接