2013-04-22 75 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