NEST 搜索整个文档 C# Elasticsearch

Has*_*tou 3 c# elasticsearch nest

我想使用 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()
        );
Run Code Online (Sandbox Code Playgroud)

我的 MyObject 类:

public class MyObject
    {
        public int id { get; set; }
        public int age { get; set; }
        public string lastname { get; set; }
        public string name { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当在前 10k 文档中找不到此查询时,它不会继续搜索结果滚动 API 的其余部分。

我的问题是如何实现这一点(即在 Scroll API 中移动整个页面,尽管没有点击......)?

Rus*_*Cam 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;
});
Run Code Online (Sandbox Code Playgroud)