gpt4 book ai didi

c# - 具有geo_shape字段的文档不能反序列化?

转载 作者:行者123 更新时间:2023-12-02 23:03:14 24 4
gpt4 key购买 nike

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

----------

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

    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed, Store = true, IncludeInAll = false)]
public Nest.GeoShape ElasticShape { get; set; }

这是索引的创建,以防万一是问题所在...
    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))))

----------

问题2-当我执行查询时,返回的结果无法反序列化。

{"Could not create an instance of type Nest.GeoShape. Type is an interface or abstract class and cannot be instantiated. Path 'hits.hits[0]._source.elasticShape.coordinates', line 10, position 19."}



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

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

最佳答案

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

它要求编写CustomCreationConverter来处理可用于不同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; }

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

关于c# - 具有geo_shape字段的文档不能反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com