0

我有一个大约 2500 万条记录的大型数据集我正在使用 searchAfter 和 PointInTime 来遍历数据我的问题是有一种方法可以跳过超过 10000 条限制的记录

index.max_result_window

并开始挑选记录,例如从 100,000 到 105,000

现在我正在向 Elasticsearch 发送多个请求,直到达到所需的点,但它效率不高,而且耗费大量时间

我是这样做的:我计算了需要多少页来进行分页。
然后用户将发送一个带有页码的请求,即第 3 个。所以在这种情况下,只有当我到达所需的页面时,我才会将源设置为 true。这是我最好的办法,以提高性能并减少不需要页面的响应大小

 int numberOfPages =  Pagination.GetTotalPages(totalCount, _size);

 var pitResponse = await _esClient.OpenPointInTimeAsync(content._index, p => p.KeepAlive("2m"));

            if (pitResponse.IsValid)
            {
                IEnumerable<object> lastHit = null;

                    for (int round = 0; round < numberOfPages; round++)
                    {
                        bool fetchSource = round == requiredPage;
                        var response = await _esClient.SearchAsync<ProductionDataItem>(s => s
                            .Index(content._index)
                            .Size(10000)
                            .Source(fetchSource)
                            .Query(query)
                            .PointInTime(pitResponse.Id)
                            .Sort(srt => {
                                if (content.Sort == 1) { srt.Ascending(sortBy); }
                                else { srt.Descending(sortBy); }
                                return srt; })
                            .SearchAfter(lastHit)
                        );

                        if (fetchSource)
                        {
                           itemsList.AddRange(response.Documents.ToList());
                            break;
                        }
                        lastHit = response.Hits.Last().Sorts;
                    }
                }
                //Closing PIT
                await _esClient.ClosePointInTimeAsync(p => p.Id(pitResponse.Id));
4

2 回答 2

0

在这里查看:Elasticsearch 分页技术

于 2021-09-28T11:19:15.160 回答
0

我认为最好的方法是我是如何做到的

通过保持滚动时间点并仅在使用到达所需页面时加载结果.source(bool)

于 2021-10-01T08:17:10.483 回答