c# - 弹性搜索滚动使用 Nest C# 获取所有记录需要太多时间
问题描述
这是我的搜索查询过滤器
这里定义参数 ScrollPageSize 和 ScrollTimeOutMinutes
public static string scrollTimeoutMinutes = "2m";
public static int scrollPageSize = 10000;
我遇到的问题是 ScrollTimeOutMinutes =2m 并且有 315000 条记录,当在 kibana 上运行相同的查询时,使用 Scroll 需要将近 7 秒,但在使用嵌套的 C# 上,ScrollId 过期所需的时间比预期的要长
filters.Add(new TermsQuery
{
Field = new Field("MERCHANTNO"),
Terms = MERCHANTNO,
}
&& new TermsQuery
{
Field = new Field("NumericFileDate"),
Terms = UploadedFileData,
}
);
var SearchRequest = new SearchRequest<MISTransactionResponseElastic>(l_SendRequest.idxName)
{
From = 0,
Scroll = scrollTimeoutMinutes,
Size = scrollPageSize,
Query = new BoolQuery
{
Must = filters,
Filter = filterClause
}
};
这是使用滚动键并获取所有记录
var searchResponse = _elasticClient.SearchAsync<MISTransactionResponseElastic>(SearchRequest);
List<MISTransactionResponseElastic> results = new List<MISTransactionResponseElastic>();
if (searchResponse.Result.Documents.Any())
results.AddRange(searchResponse.Result.Documents);
string scrollid = searchResponse.Result.ScrollId;
bool isScrollSetHasData = true;
while (isScrollSetHasData)
{
ISearchResponse<MISTransactionResponseElastic> loopingResponse = _elasticClient.Scroll<MISTransactionResponseElastic>(scrollTimeoutMinutes, scrollid);
if (loopingResponse.IsValid)
{
results.AddRange(loopingResponse.Documents);
scrollid = loopingResponse.ScrollId;
}
isScrollSetHasData = loopingResponse.Documents.Any();
}
var records = results;
解决方案
推荐阅读
- ios - 为什么我的多通道映射不能正常工作?
- javascript - 如何正确解析包含非常大数字的 JSON 字符串?
- amazon-web-services - 没有在 MediaPackage 中创建清单,从 AWS 控制台工作
- android - 在 setClickListener 期间以编程方式设置渐变不起作用。为什么?
- go - 如何将变量值 addr、[]net.IP 转换为字符串?
- bash - 从另一个脚本调用时,Curl 无法打开多部分文件
- oracle - 如何在Oracle中添加一个策略,用户可以从表中选择所有数据,并且只能插入、更新、删除有条件的数据
- ios - 删除 UICollectionView 中的行间距?迅速
- android - Android 分页库 - 将 Room DataSource.Factory<*, DatabaseModel> 映射到 DataSource.Factory<*, PresenterModel>
- c# - 将值插入 mysql 数据库无法按预期工作