Elasticsearch Geoshape查询错误结果

时间:2016-08-10 17:53:33

标签: elasticsearch elasticsearch-geo-shape

我在ES中有两个geo_shapes。我需要弄清楚的是了解其中一个形状(绿色)是否包含或与另一个(红色)相交的最佳方式。 请参阅下面三种不同情况的直观表示:

案例I:易于检测 - 使用绿色形状坐标使用“relation”=“within”进行Geoshape查询

案例II:也不是一个问题 - 使用绿色形状坐标使用“relation”=“INTERSECTS”进行Geoshape查询

案例III:是一个真正的问题 - 使用绿色形状坐标我尝试使用“relation”=“INTERSECTS”进行Geoshape查询,并返回红色形状作为结果...这是假的 - 这个形状不与彼此(我想是这样)即使其中一方相互接触......

有什么方法可以避免误报结果吗?还有其他任何建议如何解决这个问题?

P.S。坐标是精确的(例如:13.335594692338)。没有像tree_levels或precision这样的额外映射......

enter image description here

1 个答案:

答案 0 :(得分:4)

使用geoshape存储在Elasticsearch中的每个多边形都会转换为字符串列表。 为了缩小这个解释,我会假设你在Elasticsearch中存储的多边形正在使用geohash存储(这是geoshape类型的默认设置)。

我不想深入了解细节,但请看一下这张图片

geohash

此描述取自Elasticsearch文档(详细信息不匹配,但您需要全面了解):

  

Geohashes将世界划分为32个单元格的网格--4行和8行   列 - 每个用字母或数字表示。 g细胞覆盖一半   格陵兰岛,整个冰岛,以及大多数伟大的英国人。每个细胞都可以   进一步分为另外32个细胞,可分为   另外32个细胞,依此类推。 gc小区覆盖爱尔兰和英格兰,   gcp涵盖伦敦的大部分地区和英格兰南部的部分地区,以及gcpuuz94k   是白金汉宫的入口,精确到约5米。

您将多边形投影到矩形列表中,每个矩形都用字符串(geohash)表示。此投影的精度取决于树级别。我不知道Elasticsearch的默认树级别是什么,但如果您发现误报,那么它似乎对您来说太低了。

树级别为8 splits the world in rectangles of size 38.2m x 19.1m。如果多边形的边缘穿过此矩形的中间,则可能会或可能不会(取决于实现)将此矩形的geohash表示分配给多边形。

要解决您的问题,您需要提高树级以满足您的需求(有关映射here的更多信息)。请注意,虽然索引的大小会大大增加(也取决于形状的大小和复杂性)。作为一个示例,存储1000个区域大小的多边形(一些具有100个点),树级别为8 - 索引大小约为600-700MB。

请记住,无论您选择哪种树级别,您都有可能获得一些误报,因为 geohash永远不会100%精确地表示您的形状。这是一种精确与性能的权衡, geohash是性能明智的选择