Elasticsearch Geoshape查询错误结果

And*_*pov 2 elasticsearch elasticsearch-geo-shape

我在ES中有两个geo_shapes。我需要弄清楚的是了解一种形状(绿色)是否包含另一种形状(红色)或相交的最佳方法。请在下面看到三种不同情况的可视化表示:

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

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

情况三:是一个真正的问题-使用绿色形状坐标,我尝试使用“ relation” =“ INTERSECTS”进行Geoshape查询,结果返回红色形状……这是错误的-该形状彼此不相交(我认为是这样),即使其中一方互相接触……。

有什么办法可以避免假阳性结果吗?还有其他建议如何解决此任务?

PS的坐标是精确的(例如:13.335594692338)。没有其他映射,例如tree_levels或precision ...

在此处输入图片说明

mbu*_*nik 5

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

我不想详细介绍细节,但请看这张图片

哈希

以及此描述取自Elasticsearch文档(细节不匹配,但您需要了解大图):

地理哈希将世界分为32个单元格的网格(4行8列),每个单元格由字母或数字表示。g单元覆盖格陵兰的一半,整个冰岛以及大不列颠的大部分地区。每个单元可以进一步划分为另外32个单元,后者可以划分为另外32个单元,依此类推。gc单元覆盖爱尔兰和英国,gcp覆盖伦敦的大部分地区和英格兰南部的一部分,gcpuuz94k是白金汉宫的入口,精确到约5米。

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

一棵8级的树将世界分割成大小矩形 38.2m x 19.1m。如果多边形的边缘穿过该矩形的中间,则可能会(也可能不会)(取决于实现方式)将该矩形的geohash表示分配给多边形。

为了解决您的问题,您需要增加树级别以满足您的需求(有关映射的更多信息,请参见此处)。请注意,尽管索引的大小将大大增加(还取决于形状的大小和复杂性)。作为示例,存储1000个树大小为8的区域大小的多边形(有些具有100个点),索引大小约为600-700MB。

请记住,无论您选择哪种树级别,总是会冒一些误报的风险,因为geohash永远不会100%精确地表示您的形状。这是精度与性能之间的权衡,而geohash是性能明智的选择。