使用 ElasticSearch Nest 索引动态对象 - *** 异常
Posted
技术标签:
【中文标题】使用 ElasticSearch Nest 索引动态对象 - *** 异常【英文标题】:Index dynamic Objects with ElasticSearch Nest - *** Exception 【发布时间】:2018-08-13 13:37:46 【问题描述】:我想使用 ElasticSearch Nest Client 为一组动态对象编制索引。 这些对象首先由 NewtonsoftJson.NET 从 JSON 文件具体化为动态对象,然后由程序操作。所有对象都有一个属性“Id”。这应该作为 ElasticSearch 的“_id”字段。 对于相同的数据记录,“_id”字段必须相同,以便以后能够更新数据。 因为属性“IdProperty”不能添加到动态对象和 映射也不能用,我只好下面的解决方案。 我想保留动态对象,因为我只操作了几个属性,而其他属性对我不感兴趣。
var values = new List<dynamic>();
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Id = "ABC";
obj.SomeValue0 = "12";
obj.SomeValue1 = 99;
values.Add(obj);
var descriptor = new BulkDescriptor();
// Now i want to Index this List
foreach (var doc in values)
// Here the ***Exception will be thrown
descriptor.Index<object>(i => i
.Index("abc")
.Id(doc.Id)
.Document(doc));
client.Bulk(descriptor);
(Index a dynamic object using NEST - 这是我的灵感)
此示例在索引期间引发 *** 异常。列表中是否包含一个或多个对象都没有关系。
有趣的是,以下方法可以正常工作。唯一不起作用的是 ElasticSearch“_id”字段是自动生成的,因此与“Id”字段不对应。
client.IndexMany(value, index);
第一种可能性我做错了什么,是否有可能在动态对象上设置“_id”?
【问题讨论】:
【参考方案1】:你需要
-
将
Id
属性转换为string
(或Nest.Id
,如果它可以是隐式转换为Nest.Id
的另一种类型,例如Guid
将对象转换为object
这是一个例子
var client = new ElasticClient();
var values = new List<dynamic>();
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Id = "ABC";
obj.SomeValue0 = "12";
obj.SomeValue1 = 99;
values.Add(obj);
var descriptor = new BulkDescriptor();
// Now i want to Index this List
foreach (var doc in values)
descriptor.Index<object>(i => i
.Index("abc")
.Id((Id)doc.Id)
.Document((object)doc));
client.Bulk(descriptor);
它将发送如下请求
POST http://localhost:9200/_bulk
"index":"_index":"abc","_type":"object","_id":"ABC"
"Id":"ABC","SomeValue0":"12","SomeValue1":99
Dynamic types don't play nicely with generic types 和成员访问表达式,看起来与运行时类型解析有关。在上面的示例中,我建议使用匿名类型和 List<object>
【讨论】:
以上是关于使用 ElasticSearch Nest 索引动态对象 - *** 异常的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 一起使用