使用ElasticSearch Nest索引动态对象-StackOverflow异常

时间:2018-08-13 13:37:46

标签: c# elasticsearch nest

我想使用 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 StackOverflowException will be thrown
    descriptor.Index<object>(i => i
        .Index("abc")
        .Id(doc.Id)
        .Document(doc));
}

client.Bulk(descriptor);

({Index a dynamic object using NEST-这是我的灵感)

此示例在编制索引期间引发了StackOverflow异常。列表中是否有一个或多个对象都没有关系。

有趣的是,以下方法可以正常工作。唯一不起作用的是 ElasticSearch的“ _id”字段是自动生成的,因此与“ Id”字段相对应。

client.IndexMany(value, index);

第一种可能性是我做错了什么,并且有可能在动态对象上设置“ _id”吗?

1 个答案:

答案 0 :(得分:1)

您需要

  1. Id属性投射到string(如果可能是Nest.Id的另一种类型,例如Nest.Id < / li>
  2. 将对象投射到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);

Dynamic types don't play nicely with generic types和成员访问表达式,它们似乎与运行时类型解析有关。在上面的示例中,我建议使用匿名类型和POST http://localhost:9200/_bulk {"index":{"_index":"abc","_type":"object","_id":"ABC"}} {"Id":"ABC","SomeValue0":"12","SomeValue1":99}