使用 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&lt;object&gt;

【讨论】:

以上是关于使用 ElasticSearch Nest 索引动态对象 - *** 异常的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 一起使用

ElasticSearch NEST笔记

为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?

Elasticsearch,如何使 NEST 地图响应类

Elasticsearch NEST使用指南:映射和分析

是否可以使用 Nest 将查询列表传递给 ElasticSearch?