Nest dbгеография

Я использую Nest 6.2.0 для подключения к эластичному поиску.

Я пытаюсь сопоставить класс, содержащий объекты DBGeography, и я попытался добавить тег [GeoShape] и получил следующую ошибку.

ServerError = {ServerError: 400Type: mapper_parsing_exception Reason: "failed to parse" CausedBy: "Type: not_x_content_exception Reason: "Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes""}

Код, который я использую для создания индекса и документа:

// Create an index
response = Connection.CreateIndex(indexName, c => c
                   .Mappings(ms => ms
                   .Map<RACE.DataModels.EventModels.Event.Route>(m => m
                   .AutoMap<RACE.DataModels.EventModels.Event.Route>()
                   )
                   )
                   );

// Add document to index
result = Connection.Index(obj, i => i
                    .Index(indexName));

Кроме того, вот код объекта Route, который я пытаюсь добавить в индекс.

public partial class Route : BaseClass
        {
              [Key]
              public Guid ID { get; set; }

              [Required]
              [Display(Name = "Event")]
              public Guid EventID { get; set; }

              [Required]
              [Display(Name = "Route Name")]
              public string Name { get; set; }

              [Display(Name = "Description")]
              public string Description { get; set; }

              [Required]
              [Display(Name = "Path Type")]
              public int PathType { get; set; }

              [GeoShape]
              [Required]
              [Display(Name = "Route Path")]
              public DbGeography Path { get; set; }

              //[GeoShape]
              [Ignore]
              public string PathWKT { get { return Path.WellKnownValue.WellKnownText; } }

              [GeoShape]
              [Display(Name = "Start")]
              public DbGeography Start { get; set; }

              [GeoShape]
              [Display(Name = "End")]
              public DbGeography End { get; set; }

              [Display(Name = "Laps")]
              public int Laps { get; set; }

              [Display(Name = "Status")]
              public int Status { get; set; }

              [Ignore]
              [ForeignKey("EventID")]
              public virtual Event Event { get; set; }

              [Ignore]
              [ForeignKey("RouteID")]
              public virtual List<Gateway> Gateways { get; set; }

        }

Препятствует ли DBGeography правильному отображению объекта, и как я могу правильно сопоставить объект DBGeography с GeoShape?

0
0
114
1

Ответы 1

NEST не знает, как сериализовать типы DbGeography. У вас есть следующие варианты:

  1. Напишите JsonConverter, который может сериализовать DbGeography в geo_shape geoJSON, который поддерживает Elasticsearch, и подключить JsonNetSerializer из Nest.JsonNetSerializer пакет nuget, чтобы использовать этот преобразователь.

или

  1. Сопоставьте тип DbGeography с соответствующим типом IGeoShape, который NEST знает, как сериализовать, и используйте IGeoShape в вашем документе POCO. Вероятно, вы могли бы использовать NetTopologySuite и такие типы, как WKTReader, чтобы помочь с преобразованием.

Elasticsearch 6.2.0 поддерживает ввод geo_shape как WKT, но это еще не отображается в NEST; есть открытый вопрос, чтобы добавить его в следующий выпуск. По крайней мере, я ожидаю, что это поддержит десериализацию WKT в NEST IGeoShape.

Другие вопросы по теме