簡體   English   中英

使用 NEST 和 C# 滾動彈性搜索

[英]Elastic Search scrolling with NEST and C#

我正在使用以下代碼循環/滾動彈性搜索框中的所有文檔:

const string indexName = "bla";
var client = GetClient(indexName);
const int scrollTimeout = 1000;

var initialResponse = client.Search<Document>
    (scr => scr.Index(indexName)
    .From(0)
    .Take(100)
    .MatchAll()
    .Scroll(scrollTimeout))
;

List<XYZ> results;
results = new List<XYZ>();

if (!initialResponse.IsValid || string.IsNullOrEmpty(initialResponse.ScrollId))
throw new Exception(initialResponse.ServerError.Error.Reason);

if (initialResponse.Documents.Any())
results.AddRange(initialResponse.Documents);

var scrollid = initialResponse.ScrollId;
bool isScrollSetHasData = true;
while (isScrollSetHasData)
{
    var loopingResponse = client.Scroll<XYZ>(scrollTimeout, scrollid);

    if (loopingResponse.IsValid)
    {
        results.AddRange(loopingResponse.Documents);
        scrollid = loopingResponse.ScrollId;
    }
    isScrollSetHasData = loopingResponse.Documents.Any();

    // do some amazing stuff
}

client.ClearScroll(new ClearScrollRequest(scrollid));

出於某種原因, loopingResponse 比預期的要早得多 - 即滾動完成。 有人能看出我的代碼有什么根本性的錯誤嗎? 謝謝!

查看您的代碼,我認為scrollTimeout可能是問題所在。 通常滾動用於要返回的大塊數據,並且 1000 毫秒不足以在請求之間保持搜索上下文處於活動狀態。 您可以嘗試將其增加到幾分鍾以找到最適合您的情況的數字:

var scrollTimeout = new Time(TimeSpan.FromMinutes(3));

或者根據源代碼,您可以使用時間單位(微米、納米、毫秒、s、m、h 和 d):

var response = client.Search<Document>(scr => scr.Index(indexName)
    ...
    .Scroll("3m")
    );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM