【问题标题】:Abstract object not mapped correctly in Elasticsearch using Nest 7.0.0-alpha1使用 Nest 7.0.0-alpha1 在 Elasticsearch 中未正确映射抽象对象
【发布时间】:2019-04-25 21:50:07
【问题描述】:

我正在使用 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);

使用 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());

是否仍然可以从 NEST 7.0.0-alpha1 中的具体类映射数据?

【问题讨论】:

  • 我怀疑这是因为 LinkActor 上的属性类型是 Actor 并且序列化程序使用它而不是检查分配给该属性的运行时类型。您介意在github.com/elastic/elasticsearch-net/issues 上为此打开一个问题吗?
  • 嗨@Russ Cam,很抱歉回复晚了。我打开了一个问题here 并创建了一个存储库,我试图在其中更容易重现问题。该存储库已在问题中链接。

标签: elasticsearch nest


【解决方案1】:

我找到了一个使用 NEST.JsonNetSerializer 的解决方法(记得安装这个),它允许我直接传递一个 JObject:

使用池连接到 Elasticsearch,以便您可以添加 JsonNetSerializer.Default:

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,添加它们以获得CamelCasing):

var linkActorSerialized = JsonConvert.SerializeObject(linkActor);
var linkActorJObject = JObject.Parse(linkActorSerialized);
result = client.IndexDocument(linkActorJObject);

这给出了预期的结果:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2020-07-03
    • 1970-01-01
    • 2019-08-19
    • 2016-06-21
    相关资源
    最近更新 更多