使用半径索引字段进行Solr空间搜索?

时间:2017-03-14 14:26:46

标签: elasticsearch indexing solr lucene geospatial

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

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

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

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

如果lat / lng组合是否属于某个城市,我该怎么办?

例如,给定点40.419691, -3.701254,如何确定这是否属于巴塞罗那?

1 个答案:

答案 0 :(得分:1)

你可以在Lucene,Solr或ES中轻松完成。

以Solr为例:

  1. 声明一种SpatialRecursivePrefixTreeFieldType。这允许您索引不同的形状,而不仅仅是点
  2. 通过使用lat / long和radius,您可以为每个城市创建一个特定的圆,并在名为“shape”的字段中为该形状编制索引,例如:

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

    fq=shape:"Intersects(40.419691 -3.701254)"
    
  4. 请务必检查您正在使用的Lucene / Solr / ES特定版本的docs和javadocs,因为API已在此空间中进行更改