无法反序列化带有geo_形状字段的文档?

无法反序列化带有geo_形状字段的文档?,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我的索引包含一个类型为Nest.GeoShape的字段 ---------- 问题#1——Kibana将该字段显示为“indexed=false”,尽管它是这样定义的(在索引创建期间使用.MapFromAttributes()) 这里是索引创建,以防出现问题 client.CreateIndex(c => c .Index(indexName) .InitializeUsing(set) .AddMapping<ItemSear

我的索引包含一个类型为Nest.GeoShape的字段

---------- 问题#1——Kibana将该字段显示为“indexed=false”,尽管它是这样定义的(在索引创建期间使用.MapFromAttributes())

这里是索引创建,以防出现问题

    client.CreateIndex(c => c
        .Index(indexName)
        .InitializeUsing(set)
        .AddMapping<ItemSearchable>(m => m
                    .MapFromAttributes()
                    .Properties(props => props
                            .GeoShape(x => x
                                .Name(n => n.ElasticShape)
                                .Tree(GeoTree.Geohash)
                                .TreeLevels(9)
                                .DistanceErrorPercentage(0.025))))
client.CreateIndex(c=>c
.Index(索引名)
.初始化(设置)
.AddMapping(m=>m
.MapFromAttributes()
.Properties(props=>props
.GeoShape(x=>x
.Name(n=>n.ElasticShape)
.Tree(GeoTree.Geohash)
特列维尔斯先生(9)
.DistanceErrorPercentage(0.025)))
---------- 问题2——当我执行查询时,返回的结果无法反序列化

{“无法创建Nest.GeoShape.type类型的实例。type是接口或抽象类,无法实例化。路径'hits.hits[0]。_source.elasticShape.coordinates',第10行,位置19。”}

我认为这是因为我使用的是Nest.GeoShape,而不是显式的GeoShape类型(如EnvelopeGeoShape),但在我的例子中,每个文档都有不同的形状(5个可能是圆、3个矩形、2个多边形和74个点)


那么,有没有一种方法可以进一步控制Json反序列化以检查类型并显式映射它以生成特定类型?或者(理想情况下)有没有一种方法可以让反序列化自动从类型字段中“找出”它?

好的,下面是我发现的反序列化解决方案(问题2)

它需要编写一个CustomCreationConverter来处理不同地理图形类型可用的特定字段。以下是点的示例:

public class CustomNestGeoShapeConverter : CustomCreationConverter<Nest.GeoShape>
{
    public override Nest.GeoShape Create(Type objectType)
    {
        return null;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if(token == null) return null;

        switch (token["type"].ToString())
        {
            case "point":
                {
                    var coords = new List<double>();
                    coords.Add(Double.Parse(token["coordinates"][0].ToString()));
                    coords.Add(Double.Parse(token["coordinates"][1].ToString()));
                    return new Nest.PointGeoShape() { Coordinates = coords };
                }
        }

        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

现在这对我来说非常有效,但我仍然需要测试是否可以搜索形状,即使Kibana认为该字段实际上没有索引(问题1)。

我看到映射文档说“geo_形状值只能通过_源字段检索。”如果是这种情况,那么我如何告诉ElasticClient不要尝试反序列化该字段?我很惊讶这不是一个更忙的问题。感谢您提供的信息。您是否找到更好的方法来反序列化可以是多种几何体类型之一的geoshape属性?
public class CustomNestGeoShapeConverter : CustomCreationConverter<Nest.GeoShape>
{
    public override Nest.GeoShape Create(Type objectType)
    {
        return null;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if(token == null) return null;

        switch (token["type"].ToString())
        {
            case "point":
                {
                    var coords = new List<double>();
                    coords.Add(Double.Parse(token["coordinates"][0].ToString()));
                    coords.Add(Double.Parse(token["coordinates"][1].ToString()));
                    return new Nest.PointGeoShape() { Coordinates = coords };
                }
        }

        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
    [JsonConverter(typeof(CustomNestGeoShapeConverter)), ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true, IncludeInAll = false)]
    public Nest.GeoShape ElasticShape { get; set; }