Elasticsearch - 嵌套 - 更新插入
Elasticsearch - NEST - Upsert
我有以下两个类
条目
public class Entry
{
public Guid Id { get; set; }
public IEnumerable<Data> Data { get; set; }
}
条目数据
public class EntryData
{
public string Type { get; set; }
public object Data { get; set; }
}
我有一堆不同的应用程序,它们将消息生成到一个队列中,然后我在一个单独的应用程序中使用这些消息,以将该数据存储在 elasticsearch 中。
我对所有消息都使用 CorrelationId,我想将此 ID 用作 elasticsearch 中的 ID。
所以给出以下数据:
var id = Guid.Parse("1befd5b62b944b4aa600c85632159e11");
var entries = new List<Entry>
{
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Published"
},
}
},
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Published"
},
}
},
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Published"
},
}
},
};
我希望在 elasticsearch 中将其保存为 一个条目,其中 ID == 1befd5b6-2b94-4b4a-a600-c85632159e11
和一个包含 的 data
数组9个元素.
我在尝试以下操作时遇到了一些问题:
var result = await _elasticClient.BulkAsync(x => x.Index("journal").UpdateMany(entries, (descriptor, entry) => {
descriptor.Doc(entry);
return descriptor.Upsert(entry);
}), cancellationToken);
但这只是覆盖数据数组中已经存在的任何内容,计数是 3 而不是 9(仅保存 Application3 条目)。
那么,有没有可能做我想做的事呢?我以前从未使用过 elasticsearch,所以感觉我可能在这里遗漏了一些简单的东西……:)
设法这样解决:
var result = await _elasticClient.BulkAsync(x => x.Index("journal").UpdateMany(entries, (descriptor, entry) => {
var script = new InlineScript("ctx._source.data.addAll(params.data)")
{
Params = new Dictionary<string, object> {{"data", entry.Data}}
};
descriptor.Script(b => script);
return descriptor.Upsert(entry);
}), cancellationToken);
我有以下两个类
条目
public class Entry
{
public Guid Id { get; set; }
public IEnumerable<Data> Data { get; set; }
}
条目数据
public class EntryData
{
public string Type { get; set; }
public object Data { get; set; }
}
我有一堆不同的应用程序,它们将消息生成到一个队列中,然后我在一个单独的应用程序中使用这些消息,以将该数据存储在 elasticsearch 中。
我对所有消息都使用 CorrelationId,我想将此 ID 用作 elasticsearch 中的 ID。 所以给出以下数据:
var id = Guid.Parse("1befd5b62b944b4aa600c85632159e11");
var entries = new List<Entry>
{
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION1_Published"
},
}
},
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION2_Published"
},
}
},
new Entry
{
Id = id,
Data = new List<EntryData>
{
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Received"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Validated"
},
new EntryData
{
Data = DateTime.UtcNow,
Type = "APPLICATION3_Published"
},
}
},
};
我希望在 elasticsearch 中将其保存为 一个条目,其中 ID == 1befd5b6-2b94-4b4a-a600-c85632159e11
和一个包含 的 data
数组9个元素.
我在尝试以下操作时遇到了一些问题:
var result = await _elasticClient.BulkAsync(x => x.Index("journal").UpdateMany(entries, (descriptor, entry) => {
descriptor.Doc(entry);
return descriptor.Upsert(entry);
}), cancellationToken);
但这只是覆盖数据数组中已经存在的任何内容,计数是 3 而不是 9(仅保存 Application3 条目)。
那么,有没有可能做我想做的事呢?我以前从未使用过 elasticsearch,所以感觉我可能在这里遗漏了一些简单的东西……:)
设法这样解决:
var result = await _elasticClient.BulkAsync(x => x.Index("journal").UpdateMany(entries, (descriptor, entry) => {
var script = new InlineScript("ctx._source.data.addAll(params.data)")
{
Params = new Dictionary<string, object> {{"data", entry.Data}}
};
descriptor.Script(b => script);
return descriptor.Upsert(entry);
}), cancellationToken);