【问题标题】:Solr spatial search using an indexed field for radius?Solr空间搜索使用半径的索引字段?
【发布时间】:2017-08-04 22:44:41
【问题描述】:

所以我有一个城市索引,看起来像这样:

{
  "location": "41.388587, 2.175888",
  "name": "BARCELONA",
  "radius": 20
}

我们有几十个。我需要能够使用单个 lat/lng 组合查询此索引,并查看它是否属于我们的“城市”之一。

location 属性是城市的中心,radius 是城市的半径,以公里为单位(假设所有城市都是圆形)。我们也可以假设没有城市重叠。

如何返回 lat/lng 组合是否属于某个城市?

例如,给定点40.419691, -3.701254,我如何确定它是否属于 BARCELONA?

【问题讨论】:

    标签: elasticsearch indexing solr lucene geospatial


    【解决方案1】:

    在 Lucene、Solr 或 ES 中,您都可以轻松完成。

    以 Solr 为例:

    1. 声明一个 SpatialRecursivePrefixTreeFieldType 类型。这使您可以索引不同的形状,而不仅仅是点
    2. 通过使用纬度/经度和半径,您可以为每个城市创建一个特定的圆圈,并在名为“形状”的字段中为该形状编制索引:

      {
        "location": "41.388587, 2.175888",
         "name": "BARCELONA",
         "shape": "CIRCLE (2.175888 41.388587, 20)"
      }
      
    3. 然后您只需查询与您的观点相交的任何文档(未经测试):

      fq=shape:"Intersects(40.419691 -3.701254)"
      

    请务必查看文档和 javadocs 以了解您正在使用的 Lucene/Solr/ES 的特定版本,因为该领域的 API 一直在变化

    【讨论】:

    • 谢谢,我之前没用过那个字段类型。如何使用其他字段作为 RPT 的中心点和半径?
    • 我添加了一个 UNTESTED 示例,因此您会有所了解,但请验证 lat/long 的顺序、半径单位,并检查 javadocs、solr 测试(良好的信息来源),因为这些 api 已经发展在大多数版本中都有很多
    • 是的,我正在使用 Solr 5.4,完全不知道如何让它工作。
    • 您的示例是 JSON 格式的,但 XML 如何生成它?
    • 可以在 solr 6.1 中对 CIRCLE 进行索引吗?还是5.1?我发现这个线程 (stackoverflow.com/questions/42429495/…) 说它已被删除,并且我一生都无法让 Circle 工作。我收到一个未知的形状定义错误。有解决办法吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多