2013-04-22 76 views
2

我们使用Elasticsearch来索引无模式数据。问题是我们要索引的大多数条目包含"longitude","latitude","lat""long"等字段。Elasticsearch使用geographicoint动态映射

索引该数据的最佳方法是什么?因此字段类型允许使用地理距离过滤器进行搜索?

非常感谢。

+0

我最终在我的应用程序中做了这件事,并在索引之前将“映射”放入elasticsearch中。不是真的想要我想要但仍然有效。喜欢在这里提出http://stackoverflow.com/questions/16151646/how-to-automatically-map-location-to-geo-point-elasticsearch/16153901#16153901 – jackdbernier 2013-04-26 15:29:01

回答

5

我知道已经有一段时间,因为你发布了这个,但如果有人像我一样绊倒它,这里有一些方法来做到这一点。

在我们的例子中,我们需要一个动态的半径所以这里的映射,我们有:

"mappings": { 
    "mygeopoints": { 
     "properties": { 
      "geopoint": { 
       "type": "geo_point", 
       "lat_lon" : true 
      }, 
      "radius": { 
       "type": "long" 
      } 
     } 
    } 
} 

我们的文档使用SQL查询,看起来像被索引:

SELECT label, (lat || ',' || lon) as geopoint, radius FROM points; 

我们将地理点作为一个字符串发送,该字符串包含由昏迷分隔的纬度和经度。

到现在通过搜索点你可以使用geo_distance filter

"filter" : { 
    "geo_distance" : { 
     "geopoint" : [ 5.7, 43.5 ], 
     "distance" : "15km" 
    } 
} 

在我们的身边,虽然,我们需要的动态范围,所以我们没有找到比使用script filter任何其他解决方案。

"filter" : { 
    "script" : { 
     "script" : "!doc['geopoint'].empty && doc['geopoint'].distanceInKm(43.5,5.7) <= doc['radius'].value" 
    } 
} 
+0

您定义的“脚本”查询经纬度内的经纬度文件内部的“半径”? – zengr 2014-05-14 00:09:28

+0

@zengr我不知道我明白你的问题。 – Crystark 2014-05-14 07:34:38

+0

发表在这里:http://stackoverflow.com/questions/23661930/conditional-query-for-geo-location-lookup – zengr 2014-05-14 18:05:17