c# - 使用 IndexMany 时,Elasticsearch 在动态类型上推断 _id
问题描述
我正试图解决一个问题。我正在构建一个应用程序,我们在其中索引Elastic 中的资产。资产的性质是非常动态的,因为它们包含客户端元数据,这些元数据因客户端而异。
因此,索引是根据 C# 中的动态列表构建的。这实际上就像一个魅力。问题是,在使用 C# 接口时,我无法控制 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# 接口的 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)));
这是运行时限制。
推荐阅读
- amazon-web-services - AWS lambda 自动扩展
- java - 将整数数组转换为向量的最佳方法?在java中
- c# - 如何在 C# 中查找对枚举值的 .ToString() 调用
- javascript - 如何在 p5.js 中保持分辨率的同时拉伸正弦图?
- python - python cv2溢出RAM
- c - 如何识别 mpegts 文件?
- nginx - Kubeadm Kubernetes 集群无法使用 ingress 将外部 IP 地址映射到域名
- ansible - 如何从ansible库存文件中跳过主机名?
- javascript - 如何将自动对焦设置为选择下拉列表中的输入?
- django - modelManager get_by_natural 密钥方法更改 USERNAME_FIELD 影响我的身份验证?