Elasticsearch-NEST-Upsert

问题描述 投票:0回答:1

我有以下两个课程

条目

public class Entry
{
    public Guid Id { get; set; }
    public IEnumerable<Data> Data { get; set; }
}

EntryData

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"
            },
        }
    },

};

我希望在弹性搜索中将其另存为一个条目,其中ID == 1befd5b6-2b94-4b4a-a600-c85632159e11和一个包含9个元素data数组。

尝试以下操作时,我有点想让它正常工作:

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,因此感觉好像我在这里错过了一些简单的事情...:)

elasticsearch nest
1个回答
1
投票

设法解决这个问题:

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);
© www.soinside.com 2019 - 2024. All rights reserved.