首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch - NEST - Upsert

Elasticsearch - NEST - Upsert
EN

Stack Overflow用户
提问于 2019-12-07 13:41:46
回答 1查看 417关注 0票数 1

我有以下两门课

条目

代码语言:javascript
复制
public class Entry
{
    public Guid Id { get; set; }
    public IEnumerable<Data> Data { get; set; }
}

EntryData

代码语言:javascript
复制
public class EntryData
{
    public string Type { get; set; }
    public object Data { get; set; }
}

我有一组不同的应用程序,它们向队列生成消息,然后在单独的应用程序中使用该队列,以便将数据存储在elasticsearch中。

我对所有消息使用一个CorrelationId,我希望在elasticsearch中使用这个ID作为ID。因此,鉴于以下数据:

代码语言:javascript
复制
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中的one entry,其中ID == 1befd5b6-2b94-4b4a-a600-c85632159e11和包含9元素data数组。

当我试着做以下几件事时,我有点为让它起作用而挣扎:

代码语言:javascript
复制
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合作过,所以感觉好像我错过了一些简单的东西。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 14:24:46

设法像这样解决这个问题:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59226587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档