爲了使它工作,你需要修改你的映射是這樣的:那麼
PUT /locations
{
"mappings": {
"location": {
"properties": {
"location": {
"type": "geo_point"
},
"timestampMs": {
"type": "long"
},
"accuracy": {
"type": "long"
}
}
}
}
}
,當你索引你的文件,你需要除以千萬緯度和經度,這樣的指標:
PUT /locations/location/1
{
"timestampMs": "1461820561530",
"location": {
"lat": -37.8103308,
"lon": 14.4967407
},
"accuracy": 35
}
最後,下方的搜索查詢......
POST /locations/location/_search
{
"aggregations": {
"zoomedInView": {
"filter": {
"geo_bounding_box": {
"location": {
"top_left": "-37, 14",
"bottom_right": "-38, 15"
}
}
},
"aggregations": {
"zoom1": {
"geohash_grid": {
"field": "location",
"precision": 6
},
"aggs": {
"ts": {
"date_histogram": {
"field": "timestampMs",
"interval": "15m",
"format": "DDD yyyy-MM-dd HH:mm"
}
}
}
}
}
}
}
}
...將產生FOL降脂結果:
{
"aggregations": {
"zoomedInView": {
"doc_count": 1,
"zoom1": {
"buckets": [
{
"key": "k362cu",
"doc_count": 1,
"ts": {
"buckets": [
{
"key_as_string": "Thu 2016-04-28 05:15",
"key": 1461820500000,
"doc_count": 1
}
]
}
}
]
}
}
}
}
UPDATE
根據我們的討論,這裏是一個可以爲你工作的解決方案。使用Logstash,你可以打電話給你的API並檢索大型JSON文件(使用http_poller
input),提取/轉換的所有位置,並將其沉入Elasticsearch(與elasticsearch
output)很容易。
下面是爲了格式化每個事件的過程,如我在最初的答案中所述。
- 使用
http_poller
可以檢索我設置的時間間隔爲1天JSON位置(注意,但你可以改變一些其他的價值,或者乾脆運行Logstash手動要檢索的每一次位置)
- 然後我們
split
的位置排列成單獨的事件
- 然後我們由10,000,000劃分緯度/經度字段,以獲取正確的座標
- 我們還需要通過移動和刪除某些領域
把它清理乾淨一點
- Fi應受,我們只是給每個事件Elasticsearch
Logstash配置locations.conf
:
input {
http_poller {
urls => {
get_locations => {
method => get
url => "http://your_api.com/locations.json"
headers => {
Accept => "application/json"
}
}
}
request_timeout => 60
interval => 86400000
codec => "json"
}
}
filter {
split {
field => "locations"
}
ruby {
code => "
event['location'] = {
'lat' => event['locations']['latitudeE7']/10000000.0,
'lon' => event['locations']['longitudeE7']/10000000.0
}
"
}
mutate {
add_field => {
"timestampMs" => "%{[locations][timestampMs]}"
"accuracy" => "%{[locations][accuracy]}"
"junk_i_want_to_save_but_ignore" => "%{[locations][junk_i_want_to_save_but_ignore]}"
}
remove_field => [
"locations", "@timestamp", "@version"
]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "locations"
document_type => "location"
}
}
然後,您可以用下面的命令來運行:
bin/logstash -f locations.conf
當已經運行,你可以啓動你的搜索查詢,你應該得到你的期望。
您可以請示例文檔和您的映射?讓人們更容易引導您的問題並嘗試解決問題。 – Val
嗨瓦爾。好點子!我已經包含了上面的示例數據。 – user894199
如果此GeoJSON數據已正確編制索引,則可以使用geohash_grid聚合來查看每個位置在二維空間中的分佈情況(在〜100m矩形中)。您還可以將它與「date_histogram」聚合相結合,並查看點是如何及時分配的。 – Val