我正在尝试使用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);
答案 0 :(得分:1)
我认为它无法尝试索引一组文档,重试操作并创建一些重复文件。
BulkAll
永远不会尝试重新编制已成功编入索引的索引文档。
如果每个文档都有一个"id"
属性/字段,那么这将用作文档的"_id"
,这将避免两次索引同一文档,因为具有相同id的后续文档将覆盖现有文档。