Elasticsearch .NET只允许我批量上传80次

时间:2018-01-15 03:26:54

标签: elasticsearch nest elasticsearch.net

我在Windows上使用ASP.NET API(.NET 4.6)上的Elasticsearch.NET(5.6),并尝试发布到AWS上托管的elasticsearch(我已尝试过5.1.1和6,两者都是相同的行为)。

我有以下代码将文档批量索引到Elasticsearch。图像多次调用以下代码块:

        var node = new System.Uri(restEndPoint);
        var settings = new ConnectionSettings(node);
        var lowlevelClient = new ElasticLowLevelClient(settings);

        var index = indexStart + indexSuffix;

        var items = new List<object>(list.Count() * 2);
        foreach (var conn in list)
        {
            items.Add(new { index = new { _index = index, _type = "doc", _id = getId(conn) } });
            items.Add(conn);
        }

        try
        {
            var indexResponse = lowlevelClient.Bulk<Stream>(items);
            if (indexResponse.HttpStatusCode != 200)
            {
                throw new Exception(indexResponse.DebugInformation);
            }

            return indexResponse.HttpStatusCode;
        }
        catch (Exception ex)
        {
            ExceptionManager.LogException(ex, "Cannot publish to ES");
            return null;
        }

它运行正常,可以将文件发布到Elasticsearch,但它只能运行80次,80次之后,它总会出现异常:

# OriginalException: System.Net.WebException: The operation has timed out
   at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   at System.Net.HttpWebRequest.GetRequestStream()
   at Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData requestData) in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 148

最有趣的部分是:我试图将体积大小更改为200或30,结果是16000和2400,这意味着两者最终都是80次。 (每个文档大小非常相似)

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:0)

存在连接限制(另请参阅问题中来自@RussCam的评论)。所以真正的问题是持有连接的响应中的Stream

因此修复方法是indexResponse.Body.Dispose(我还没有尝试过这个)或使用VoidResponsereportClient.BulkAsync<VoidResponse>(items);,它不需要响应流。我尝试了第二个并且它有效。