elasticsearch 使用Nest 7.0.0-alpha1在Elasticsearch中未正确映射抽象对象
我正在使用NEST(.NET 4.8)导入数据,在NEST 7.0.0-alpha1中使用映射时遇到问题 我的班级结构如下:
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; }
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,很抱歉回复太晚。我已经打开了一个问题并创建了一个存储库,在那里我试图使问题更容易重现。存储库已链接到问题中。