为啥 ElasticSearch Nest 客户端会为 MultiPolygonGeoShape 抛出 invalid_shape_exception
Posted
技术标签:
【中文标题】为啥 ElasticSearch Nest 客户端会为 MultiPolygonGeoShape 抛出 invalid_shape_exception【英文标题】:Why does the ElasticSearch Nest client throw invalid_shape_exception for MultiPolygonGeoShape为什么 ElasticSearch Nest 客户端会为 MultiPolygonGeoShape 抛出 invalid_shape_exception 【发布时间】:2018-12-29 00:09:45 【问题描述】:我正在尝试使用 Nest 包将多个形状插入 ElasticSearch geo_shape 字段。
最初我使用了 Nest.PolygonGeoShape,它适用于单个形状,但是当我有多个形状时,弹性会抛出
invalid_shape_exception: Invalid shape: Hole is not within polygon
我阅读并发现具有多种形状的多边形被视为外部形状和“孔”。然而,MultiPolygon 被视为单独形状的集合。
我切换到 GeoJSON.Net.Geometry.MultiPolygon 类型(不小心使用了错误命名空间中的一个),它运行良好。插入很好,反序列化也很好。
注意到命名空间,我切换到 Nest.MultiPolygonGeoShape 并返回了原始错误。
我更喜欢使用 Nest 定义的合同类型。
为什么 ElasticSearch 不将我的 MultiPolygonGeoShape 视为单独的形状?
【问题讨论】:
你能提供形状吗?链接到gist(如果它真的很大) 感谢@RussCam - 打印请求显示了差异。 【参考方案1】:回答我自己的问题:
区别实际上在于对象的数量。我检查了底层请求(感谢@Russ Cam),这些是多边形结构的差异(简化)。
[
[
[
[0.26337, 51.85278], [0.26473, 51.8509] ...
]
],
[
[
[-2.73905, 53.75779], [-2.7259, 53.75786] ...
]
],
[
[
[-2.6594, 53.7622], [-2.66654, 53.76121] ...
]
]
],
[
[
[
[0.26337, 51.85278], [0.26473, 51.8509] ...
]
],
[
[
[-2.73905, 53.75779], [-2.7259, 53.75786] ...
],
[
[-2.6594, 53.7622], [-2.66654, 53.76121] ...
]
]
],
第一个有效,第二个无效。这是因为第一个被视为 3 个单独的多边形,第二个被视为两个多边形 - 一个带有孔。即使在 MultiPolygonGeoShape 中也是如此。
【讨论】:
澄清一下,MultiPolygonShape
的初始化方式是否存在问题?
是的,这是正确的 - 在一种情况下,我正在展平我的收藏,在另一种情况下,我没有,并且映射到 IEnumerable以上是关于为啥 ElasticSearch Nest 客户端会为 MultiPolygonGeoShape 抛出 invalid_shape_exception的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ElasticSearch Nest Query 中会出现转义反斜杠?
NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题