我們使用Elasticsearch來索引無模式數據。問題是我們要索引的大多數條目包含"longitude"
,"latitude"
,"lat"
或"long"
等字段。Elasticsearch使用geographicoint動態映射
索引該數據的最佳方法是什麼?因此字段類型允許使用地理距離過濾器進行搜索?
非常感謝。
我們使用Elasticsearch來索引無模式數據。問題是我們要索引的大多數條目包含"longitude"
,"latitude"
,"lat"
或"long"
等字段。Elasticsearch使用geographicoint動態映射
索引該數據的最佳方法是什麼?因此字段類型允許使用地理距離過濾器進行搜索?
非常感謝。
我知道已經有一段時間,因爲你發佈了這個,但如果有人像我一樣絆倒它,這裏有一些方法來做到這一點。
在我們的例子中,我們需要一個動態的半徑所以這裏的映射,我們有:
"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"
}
}
我最終在我的應用程序中做了這件事,並在索引之前將「映射」放入elasticsearch中。不是真的想要我想要但仍然有效。喜歡在這裏提出http://stackoverflow.com/questions/16151646/how-to-automatically-map-location-to-geo-point-elasticsearch/16153901#16153901 – jackdbernier 2013-04-26 15:29:01