Абстрактный объект не отображается правильно в Elasticsearch с использованием Nest 7.0.0-alpha1 - PullRequest
1 голос
/ 25 апреля 2019

Я использую 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?

1 Ответ

1 голос
/ 25 апреля 2019

Я нашел обходной путь, используя 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"
}

Это обходной путь, надеюсь, кто-то сможет объяснить сопоставление в вопросе.

...