使用 searchAfter 从大堆栈的中间获取数据(跳转到特定页面,)
Fetch data from a middle of a big stack using searchAfter(jump to a specific page,)
我有一个大约 2500 万条记录的大数据集
我正在使用带有 PointInTime 的 searchAfter 遍历数据
我的问题是有一种方法可以跳过超过 10000
限制的记录
index.max_result_window
然后开始选择记录,例如从 100,000 到 105,000
现在我正在向 Elasticsearch 发送多个请求,直到我到达所需的点,但它效率不高并且消耗了大量时间
这是我的做法:
我计算了分页需要多少页。
然后用户将发送一个带有页码的请求,即 3。所以在这种情况下,只有当我到达所需的页面时,我才会将源设置为 true。
这是我设法提高性能并减少 none 所需页面
的响应大小的最佳方法
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));
我认为最好的方法就是我是怎么做的
通过使用 .source(bool)
通过时间点保持滚动并仅在到达所需页面时加载结果
我有一个大约 2500 万条记录的大数据集 我正在使用带有 PointInTime 的 searchAfter 遍历数据 我的问题是有一种方法可以跳过超过 10000
限制的记录index.max_result_window
然后开始选择记录,例如从 100,000 到 105,000
现在我正在向 Elasticsearch 发送多个请求,直到我到达所需的点,但它效率不高并且消耗了大量时间
这是我的做法:
我计算了分页需要多少页。
然后用户将发送一个带有页码的请求,即 3。所以在这种情况下,只有当我到达所需的页面时,我才会将源设置为 true。
这是我设法提高性能并减少 none 所需页面
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));
我认为最好的方法就是我是怎么做的
通过使用 .source(bool)