我想使用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; }
}
问题是当在前10k文档中找不到此查询时,它不会继续搜索结果滚动API的其余部分。
我的问题是如何实现这一点(即尽管没有命中,但仍在Scroll API的整个页面中移动......)?
答案 0 :(得分:3)
查询将搜索所有文档,但只会返回最多.Size
个文档。
您可以使用.From()
和.Size()
对结果进行分页,但是,当分页超过一百万个文档时,深度分页可能是一个问题。为此,您最好使用scroll 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;
});