c# - Elasticsearch 在使用 IndexMany 时推断动态类型的 _id

标签 c# elasticsearch nest

我正在努力解决一个问题。我正在构建一个应用程序,我们在其中索引 Elastic 中的 Assets Assets 的本质是非常动态的,因为它们包含客户端元数据,这因客户端而异。

因此,索引是从 C# 中的动态列表构建的。这实际上就像一个魅力。问题是,在使用 C# 接口(interface)时,我无法控制 Elastic 中的 _id 属性。这意味着当我更新文档时,不会更新正确的文档,而是制作新的副本。

我的代码是这样的:

List<dynamic> assets = new List<dynamic>();
var settings1 = new ConnectionSettings(
    new Uri("http://localhost:9200")
    ).DefaultIndex("assets");

var client = new ElasticClient(settings1);

//assets is build here

var indexResponse = client.Indices.Create("assets");
var BulkResponse = client.IndexMany(assets);

这确实有效,而且索引的构建几乎符合我的预期。即使我在动态上有一个名为 Id 的属性,它也没有被正确推断,这意味着文档被赋予了一个由 Elastic 决定的 _Id。因此,下次我使用相同的 Id 运行此代码时,将创建一个新文档而不是更新它。

我一直在上下搜索,但似乎找不到好的解决方案。我尝试过的一件事是:

var bulkResponse = client.Bulk(bd => bd.IndexMany(assets, (descriptor, s) => descriptor.Id(s.Id)));

但这会引发一个我无法在 .net 内核中捕获的错误。这实际上适用于 Elastic 的较低版本,但似乎已被 C# 接口(interface)的 7.2 和 7.0.1 破坏。

非常感谢任何帮助。

最佳答案

允许以下工作

var bulkResponse = client.Bulk(bd => bd.IndexMany(assets, (descriptor, s) => descriptor.Id(s.Id)));

您只需将 Id 类型转换为它的类型。例如,如果它是一个 string

var client = new ElasticClient();

var assets = new dynamic[] 
{
    new { Id = "1", Name = "foo" },
    new { Id = "2", Name = "bar" },
    new { Id = "3", Name = "baz" },     
};

var bulkResponse = client.Bulk(bd => bd.IndexMany(assets, (descriptor, s) => descriptor.Id((string)s.Id)));

这是一个运行时限制。

关于c# - Elasticsearch 在使用 IndexMany 时推断动态类型的 _id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986119/

相关文章:

elasticsearch - 如何在elasticsearch中使用过滤条件范围?

elasticsearch - 在.Net 中模拟 Elasticsearch 响应

c# - 如何将数据类型为 datetime 的列的值显示为 2014 年 5 月 1 日的格式?

c# - 有关远程 IP 地址的信息

elasticsearch - ElasticSearch-在所有字段中搜索关键字,并使用过滤器将结果配对

elasticsearch - Nest 1.0不会暴露碎片失败的原因

elasticsearch - 如何处理多词同义词

C# 问题修剪字符串中的换行符

c# - 为什么不能使用 = 运算符设置 DbContextOptions?

java - elasticsearch中的id搜索