首页 > 解决方案 > 弹性搜索滚动使用 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;

标签: c#elasticsearchnest

解决方案


推荐阅读