【问题标题】:NEST Elasticsearch GeoPoint classNEST Elasticsearch GeoPoint 类
【发布时间】:2020-05-07 16:38:57
【问题描述】:

我们有一个在索引映射中指定为 GeoPoint 的字段:

.GeoPoint(d => d.Name(c => c.Location))

如果我们创建一个对象并使用以下方法为该字段分配一个值:

location = new GeoCoordinate(54.34445, -3.2344)

索引将此显示为一个 GeoPoint,其值为 -3.2344, 54.34445

但是,如果我们使用诸如 "54.34445, -3.2344" 之类的字符串进行索引,Kibana 中的索引也将其显示为 GeoPoint,但格式为 54.34445, -3.2344

两者都不对!因为同一点的纬度/经度值将完全不同。

实际上,根据文档以 2 种不同方式创建 SAME 点,会在索引中创建两个完全不同的位置

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    GeoCoordinate ctor 以该顺序接受 latitudelongitude(也存在接受可选 z 值的重载)。

    序列化为[lon, lat],符合GeoJSON format RFC。众所周知的文本 (WKT),另一种用于表示几何的格式使用顺序 xy,分别对应于 lonlat

    以字符串形式表示的坐标格式为lat,lonSee the Important admonition in the docs.

    【讨论】:

    • 谢谢。我感到困惑的是最终在实际索引中作为数据的内容。我假设无论您在一天结束时如何定义该点,它都应该以 GeoPint 的形式出现在索引中,其坐标是 Elastic 知道如何处理的。如果您查看索引中的数据 - 如果您使用字符串创建文档,它将存储为 lat,lon 但是如果您使用地理坐标创建文档,您将在索引中看到 lon,lat。在索引中,它们都被指定为 GeoPoint,但根据您索引它的方式,它们看起来像 2 个完全不同的位置。
    • 例如,如果索引中有 2 个点都定义为 Geo Points : location = 52.6693,-8.56438 和另一个 location = -8.56438 ,52.6693 肯定它们代表 2 个不同的位置,即使它们是相同的仅指向一个使用字符串索引,另一个使用 GeoCoordinates。
    • "lat,lon" 的字符串和[lon, lat] 的双精度数组以 Elasticsearch 可以处理的两种不同表示形式表示相同的坐标。 geo_point 类型的倒排索引中实际上最终是一个四叉树编码的 64 位整数(我认为他们还没有使用 BKD 树,例如 geo_shape 类型)。每个文档的_source 将逐字反映发送到 Elasticsearch 的内容,但搜索不是针对 _source,而是针对 inverted 索引中的索引
    • 谢谢。知道了。我们在 Kibana 中不断看到的东西让我们感到困惑。
    • 对不起 - 就像本主题的完整性一样,当您将源转换为对象并尝试获取每个点的纬度/经度时,它们会正确显示吗? Elastic 如何知道基于以哪种方式编入索引的逐字记录。谢谢。
    【解决方案2】:

    有多个ways 定义/显示坐标,最值得注意的是"lat,lon" 格式的字符串或[lon,lat] 格式的数组。

    请注意,Kibana 很可能只坚持一种格式("lat,lon" -- 54.34445, -3.2344 在英国,相反在索马里海岸),而索引 doc 值支持多种格式。

    【讨论】:

    • 是的,我很感激。但是根据文档以两种不同的方式创建 SAME 点,会在索引中创建两个完全不同的位置!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2017-11-21
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多