我想完全使用Elasticsearch来过滤当前由PostGreSQL和PostGIS扩展处理的元素。

为此,我必须在(多)多边形附近的给定距离内选择每个结果。
这些多边形可能很复杂(数百个点)。

我看到a year ago,elasticsearch无法处理此类过滤器。
一年来,ES有了长足的发展(包括一个主要版本),那么现在是否支持这种过滤?如果没有,有什么计划吗?

解释一下,这是一个简单的用例:
认为此多边形大致描述了巴黎的“Ile de lacité”边界:

{
  "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

最佳答案

答案是肯定的,请参阅docs特别是几何形状过滤器。注意,多边形搜索需要添加space4jj和Java拓扑套件(JTS)依赖项。

但是,有一个警告,那就是JTS的许可,即LGPL。我引用曼宁的《 Solr in Action》(第531页)一书,这与Solr(如ElasticSearch)建立在Apache Lucene的基础上是相关的,因此也有相同的限制。



JTS提供了非常强大的空间功能,实际上,其C++端口GEOS构成了Postgis空间功能的很大一部分。因此,如果您在许可方面没有问题,则在添加JTS和spatial4J之后,您可以做更多或更少的事情。

我在 session 上听说过它,并在JTS邮件列表上看到了讨论,说JTS最终可能会切换到更为自由的许可证,例如BSD,它将为将其添加到其他许多NoSQL解决方案中作为核心而不是将其开放可选的附加组件。

08-07 20:06