Nest 5.5使用BulkAll方法复制

时间:2017-10-18 09:23:38

标签: c# .net elasticsearch nest

我正在尝试使用BulkAll方法索引某些文档,如下所示:

var waitHandle = new CountdownEvent(1);

var bulkAll = _client.BulkAll(elementList, b => b
            .Index(indexName)
            .BackOffRetries(15)
            .BackOffTime(TimeSpan.FromSeconds(55))
            .RefreshOnCompleted()
            .MaxDegreeOfParallelism(4)
            .Size(500));

bulkAll.Subscribe(observer: new BulkAllObserver(
            onNext: (b) =>
            {
                _logger.Debug("Indexed group of documents");                    
            },
            onError: (e) =>
            {
                _logger.Error(e, e.Message);
                throw e;
            },
            onCompleted: () =>
            {
                waitHandle.Signal();
            }));
waitHandle.Wait();

问题是,一旦它在onCompleted事件中发送信号,我的索引中的文档数量超出预期,这是大小参数的乘数差异,所以我认为它无法尝试索引一组文档,重试操作并创建一些重复项。

我试图调试如果在onError事件中放置断点有任何错误,但没有任何反应。

有没有办法避免这些重复?或者至少在我完成索引过程后删除它们?

我按如下方式创建Elasticsearch客户端:

ConnectionSettings settings;
settings = new ConnectionSettings(
                new StaticConnectionPool(_infrastructureSettings.ElasticServerUrls));

settings.BasicAuthentication(_infrastructureSettings.ElasticsearchUsername, _infrastructureSettings.ElasticsearchPassword);
settings.DisableDirectStreaming();
settings.MaximumRetries(15);
settings.RequestTimeout(TimeSpan.FromMinutes(4));

var client = new ElasticClient(settings);

1 个答案:

答案 0 :(得分:1)

  

我认为它无法尝试索引一组文档,重试操作并创建一些重复文件。

BulkAll永远不会尝试重新编制已成功编入索引的索引文档。

如果每个文档都有一个"id"属性/字段,那么这将用作文档的"_id",这将避免两次索引同一文档,因为具有相同id的后续文档将覆盖现有文档。