如何在 Elastic Search 中为带有 GeoShape 字符串 GeoJson 多边形的类型化对象建立索引?

How to index in Elastic Search a typed object with a GeoShape string GeoJson polygon?

我有一个类型化的 class,其中包含一个表示多边形的 GeoJson 字符串变量。 如何使用 NEST 在 Elastic Search 中对其进行索引? 用以下标记字段:

[ElasticProperty(Type = FieldType.GeoShape)]
public string Polygon { get; set; }

并在 CreateIndex 中作为

 .GeoShape(s => s
    .Name(m => m.Polygon)
    .Tree(GeoTree.Geohash)
    .TreeLevels(2)
    .DistanceErrorPercentage(0.025))

出现此错误:

failed to parse [polygon]]; nested: ElasticsearchParseException[Shape must be an object consisting of type and coordinates"

由于我将 GeJSON 作为输入并且 GeoShape 的坐标为 Geo JSON,我该如何映射此数据?我可以反序列化输入并填充 ES 结构,但这似乎是一种过于复杂、容易出错的方法。

谢谢,

莫妮卡

我写了a blog post about working with Geospatial queries with Elasticsearch and NEST

处理您希望保留为 geo_shape 类型的字段并在您的应用程序中轻松使用它们的一种好方法是使用 NetTopologySuite,其中包含许多其他有用的东西,一个序列化程序将代码中的 IGeometry 类型(例如 Polygon、LineString、MultiPolygon)转换为 GeoJSON,即 geo_shape 类型支持的格式。然后可以向 NEST 客户端注册序列化程序,以便正确处理 IGeometry 类型的模型属性。

I have an example of doing this up on BitBucket.

Russ Cam 的解决方案看起来不错。但是,如果您只需要从文件中获取形状并将其导入 ElasticSearch,那就太过分了。为了让它工作,你只需要将你的 json 反序列化为一个对象。

JsonConvert.DeserializeObject<object>(json);

因此,如果模型的多边形为 object 而不是 string,它将起作用。

[ElasticProperty(Type = FieldType.GeoShape)]
public object Polygon { get; set; }