为啥 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 中会出现转义反斜杠?

ElasticSearch NEST笔记

ElasticSearch NEST笔记

NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题

如何使用 Elasticsearch 的 NEST“.net 客户端”对所有记录进行分页?

在 Elasticsearch NEST 中的索引间歇性失败后立即调用 Search