我想完全转移elasticsearch来过滤PostGreSQL当前使用PostGIS扩展程序处理的元素。
为此,我必须选择围绕(多)多边形的给定距离内的每个结果 那些多边形可能很复杂(数百个点)。
我看到a year ago,elasticsearch无法处理此类过滤器 在一年中,ES已经有了很大的发展(包括一个主要版本),那么现在支持的那种过滤是什么?如果没有,有什么计划吗?
为了解释,这是一个简单的用例:
将此多边形视为粗略描述巴黎“Ile delacité”边界:
{
"type": "MultiPolygon",
"coordinates": [
[
[
[
2.339546203568933,
48.857710541463412
],
[
2.345168113663295,
48.856750530470009
],
[
2.350618362380806,
48.855056348509926
],
[
2.352077484084764,
48.853785674412812
],
[
2.352592468215498,
48.851611335037532
],
[
2.348730087234629,
48.852543206332619
],
[
2.343194007828603,
48.855084585345963
],
[
2.339546203568933,
48.857710541463412
]
]
]
]
}
考虑另一个岛对面的位置(因此,在多边形之外):
{
"type": "Point",
"coordinates": [
2.359378457022193,
48.850358223189644
]
}
以下是使用Django ORM的一些示例查询(我可以提供SQL等价但我相信这不相关):
>>> Location.objects.filter(point__within=(area.polygon))
[]
>>> Location.objects.filter(point__distance_lte=(area.polygon, D(m=500)))
[]
>>> Location.objects.filter(point__distance_lte=(area.polygon, D(m=550)))
[<Location: Ile saint louis>]
__distance
查找使用PostGIS ST_distance_sphere
。
答案 0 :(得分:5)
答案是肯定的,请参阅docs特别是地理形状的过滤器。注意,多边形搜索需要添加spatial4j和Java拓扑套件(JTS)依赖项。
然而,有一点需要注意,那就是JTS的许可,即LGPL。我引用Manning的书,Solr in Action,第531页,与Solr相关,就像ElasticSearch一样,是建立在Apache Lucene之上的,所以同样的限制也适用。
Apache Solr是开源的,并根据Apache 2.0许可证授权, 授予您在任何系统中使用代码和软件的权利, 包括专有系统,不承担任何法律责任 分享您的代码或支付任何许可费用。做出了决定 允许“与JTS集成”,获得更少许可 允许的LGPL(较少的一般公共许可证)。 JTS库(JAR 文件)与Spatial4j一起不包含在Solr发行版中, 将JTS作为可选依赖项,不需要使用基本形状 Solr中的(点,矩形和圆)。如果你想使用JTS 在Solr中,您必须自己添加依赖项。只要你这样做 不对JTS中的代码进行更改,通常认为它是安全的 在不使用您的应用程序的情况下引用JTS库 接触LGPL许可证(这将要求您开源 你的申请,如果它是衍生作品)。引用任何LGPL 然而,图书馆是一个法律决定,应该在其中作出 咨询贵公司的政策和/或法律顾问。如果你 只需要支持点,圆和正方形,你应该离开 定义时输出可选的JTS spatialContextFactory属性 您的地理字段类型。
JTS提供了极其强大的空间功能,实际上它的C ++端口GEOS构成了Postgis空间功能的很大一部分。因此,如果您对许可没有任何问题,一旦添加了JTS和spatial4J,您可以做更多或更少的事情。
我听过它在会议上说过,并且在JTS邮件列表上看到了讨论,JTS最终可能会转向更自由的许可证,例如BSD,它会将其打开,以便作为核心添加到许多其他NoSQL解决方案中,而不是可选的附件。