2016-08-10 68 views
0

我在ES中有兩個geo_shapes。我需要弄清楚的是瞭解其中一個形狀(綠色)是否包含或與另一個(紅色)相交的最佳方式。 請參考下面的三種不同情況的直觀表示:Elasticsearch Geoshape查詢虛假結果

案例一:容易檢測 - 利用綠色形狀座標進行Geoshape查詢與「關係」 =‘內’

案例二:還沒有要做的事情 - 使用綠色形狀座標做一個Geoshape查詢與「關係」=「INTERSECTS」

案例三:是一個真正的問題 - 使用綠色形狀座標我試圖做一個Geoshape查詢「relation」=「INTERSECTS 「並且紅色的形狀返回結果...這是錯誤的 - 這種形狀不會相互交叉(我認爲是這樣),即使其中一個邊接觸每個其他......

有什麼辦法可以避免這裏的誤報結果?任何其他建議如何解決這個任務?

P.S.座標精確(例如:13.335594692338)。有沒有像tree_levels或精度沒有額外的映射......

enter image description here

+0

我不明白爲什麼情況1使用範圍內,當紅色/綠色多邊形彼此相鄰(並觸摸邊界的一側)。 另外,案例3,根據定義,相交。他們觸摸 – coffeeaddict

+0

案例1 - 對不起,我應該使紅色有點transperant ...但它是在綠色的矩形(綠色的矩形是相同的case2-3。 ..) 關於交叉點 - 約定,但也不同意 - 交叉點是「交叉」...是n的邊界,並不意味着交叉它)無論如何,一些解決方案將是很好的定義交叉和觸摸)) ) –

+0

不幸的是,ES不支持通過'touch'進行匹配。它只提供相交(根據定義,它意味着共享一個共同點,不管它是否跨越,您可能會不同意這一點,但這是官方定義。) 如果您想要解決方法,可以從彈性搜索,並使用提供觸摸方法的JTS庫 – coffeeaddict

回答

2

這是使用geoshape存儲在Elasticsearch每個多邊形越來越轉化爲一個字符串列表。 爲了縮小這個解釋的範圍,我會假設你在Elasticsearch中存儲的多邊形是使用geohash存儲(這是geoshape類型的默認值)。

我不想陷入巨大的細節,但看看這個圖片

geohash

,這說明從Elasticsearch文檔拍攝(細節不相符,但你需要得到大的圖片):

地球哈哈把世界劃分成32格-4行和8列 列 - 每一列用一個字母或數字表示。 g格覆蓋格陵蘭島的所有冰島和大部分英國大陸的半壁江山。每個小區可以進一步劃分爲另外32個小區,其中可以劃分爲 另外32個小區,依此類推。 gc小區覆蓋愛爾蘭和英格蘭, gcp覆蓋倫敦的大部分地區和英格蘭南部的一部分,而gcpuuz94k 是白金漢宮的入口,精確到5米左右。

您的多邊形正在投影到矩形列表中,每個矩形都用一個字符串(geohash)表示。此投影的精確度取決於樹級別。我不知道Elasticsearch的默認樹層級別是什麼,但如果您發現誤報,它似乎對您而言太低。

樹級別爲8 splits the world in rectangles of size38.2m x 19.1m。如果多邊形的邊緣穿過此矩形的中間,它可能會或可能不會(取決於實現)將矩形的geohash表示分配給您的多邊形。

要解決您的問題,您需要增加樹水平以符合您的需求(更多關於地圖here)。請注意,儘管索引的大小會大大增加(也取決於形狀的大小和複雜性)。作爲一個存儲1000個區域大小多邊形(有些具有100個點)的例子,樹級別爲8 - 索引大小約爲600-700MB。

請記住,無論您選擇哪種樹木級別,您都會冒險得到一些誤報,因爲geohash永遠不會100%準確地表示您的形狀。這是一個精準度與性能之間的平衡,geohash是性能明智的選擇

+0

非常感謝您提供這樣的詳細解釋!糾正我,如果我錯了 - 基本上我可以嘗試玩「tree_levels」或「精度」,並將其設置爲「1m」,例如...(PS ES文件建議設置'「樹」:「quadtree」, 「精度」:「1m」在我的情況下聽起來合理 - 也許你可以對此發表一些評論?) –

+0

是的。你應該嘗試這些值。請記住,每次更改映射時都需要重新編制索引。 – mbudnik

+0

非常感謝您的幫助!將嘗試玩參數,並希望能夠得到更精確的結果)) –