elasticsearch 使用Nest 7.0.0-alpha1在Elasticsearch中未正确映射抽象对象,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 使用Nest 7.0.0-alpha1在Elasticsearch中未正确映射抽象对象,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 使用Nest 7.0.0-alpha1在Elasticsearch中未正确映射抽象对象

elasticsearch 使用Nest 7.0.0-alpha1在Elasticsearch中未正确映射抽象对象,elasticsearch,nest,elasticsearch,Nest,我正在使用NEST(.NET 4.8)导入数据,在NEST 7.0.0-alpha1中使用映射时遇到问题 我的班级结构如下: class LinkActor { public Actor Actor { get; set; } } abstract class Actor { public string Description { get; set; } } class Person : Actor { public string Name { get; set; }

我正在使用NEST(.NET 4.8)导入数据,在NEST 7.0.0-alpha1中使用映射时遇到问题

我的班级结构如下:

class LinkActor
{
    public Actor Actor { get; set; }
}

abstract class Actor
{
    public string Description { get; set; }
}

class Person : Actor
{
    public string Name { get; set; }
}
我通过以下方式连接到Elasticsearch:

var connectionSettings = new ConnectionSettings(new Uri(connection));
connectionSettings.DefaultIndex(indexName);
var client = new ElasticClient(connectionSettings);
实际数据如下所示:

var personActor = new Person
{
    Description = "Description",
    Name = "Name"
};

var linkActor = new LinkActor
{
    Actor = personActor
};
result = client.IndexDocument(linkActor);
数据的索引如下所示:

var personActor = new Person
{
    Description = "Description",
    Name = "Name"
};

var linkActor = new LinkActor
{
    Actor = personActor
};
result = client.IndexDocument(linkActor);
使用NEST 6.6,我在Elasticsearch 6.5.2中获得以下数据:

"actor": {
    "name": "Name",
    "description": "Description"
}
但是,当使用NEST 7.0.0-alpha1时,我在Elasticsearch 7.0.0中获得以下数据:

 "actor": {
      "description": "Description"
  }
因此,混凝土类中的数据丢失。我显然缺少/不了解一些新的映射功能,但我尝试使用AutoMap失败:

client.Map<(attempt with each of the above classes)>(m => m.AutoMap());
client.Map(m=>m.AutoMap());

是否仍然可以映射NEST 7.0.0-alpha1中混凝土类的数据?

我找到了一个使用NEST.JsonNetSerializer的解决方法(请记住安装此工具),它允许我直接传递作业对象:

使用池连接到Elasticsearch,以便添加JsonNetSerializer。默认值:

var pool = new SingleNodeConnectionPool(new Uri(connection));
var connectionSettings = new ConnectionSettings(pool, JsonNetSerializer.Default);
connectionSettings.DefaultIndex(indexName);
var client = new ElasticClient(connectionSettings);
将上面的linkActor对象转换为JObject(为了清晰起见,省略了JsonSerializerSettings,添加它们以获得JObject):

这将产生预期的结果:

"actor": {
    "name": "Name",
    "description": "Description"
}

这是一个解决方法,希望有人能够解释问题中的映射。

我怀疑这是因为
LinkActor
上的属性类型是
Actor
,序列化程序使用它而不是检查分配给属性的运行时类型。你介意为此在打开一个问题吗?嗨@Russ Cam,很抱歉回复太晚。我已经打开了一个问题并创建了一个存储库,在那里我试图使问题更容易重现。存储库已链接到问题中。