1

我有一個geojson文件,其中包含一個具有經度,緯度和時間戳的位置列表。請注意,經度和緯度由10000000使用彈性搜索地理功能來查找最常見的位置?

{ 
    "locations" : [ { 
    "timestampMs" : "1461820561530", 
    "latitudeE7" : -378107308, 
    "longitudeE7" : 1449654070, 
    "accuracy" : 35, 
    "junk_i_want_to_save_but_ignore" : [ { .. } ] 
    }, { 
    "timestampMs" : "1461820455813", 
    "latitudeE7" : -378107279, 
    "longitudeE7" : 1449673809, 
    "accuracy" : 33 
    }, { 
    "timestampMs" : "1461820281089", 
    "latitudeE7" : -378105184, 
    "longitudeE7" : 1449254023, 
    "accuracy" : 35 
    }, { 
    "timestampMs" : "1461820155814", 
    "latitudeE7" : -378177434, 
    "longitudeE7" : 1429653949, 
    "accuracy" : 34 
    } 
    .. 

許多地方乘以將是相同的物理位置(例如,用戶家中),但明顯的經度和緯度可能不完全一樣。

我想用彈性搜索和它的地理功能來產生,其中地方被認爲是相同的,如果他們是內,也就是說,彼此100米最常見的位置的排名列表?

對於每一個公共位置我也會喜歡,如果有可能,他們在那個位置所有的時間戳列表!

我倒是很欣賞一個示例查詢,讓我開始!

非常感謝提前。

+0

您可以請示例文檔和您的映射?讓人們更容易引導您的問題並嘗試解決問題。 – Val

+0

嗨瓦爾。好點子!我已經包含了上面的示例數據。 – user894199

+0

如果此GeoJSON數據已正確編制索引,則可以使用geohash_grid聚合來查看每個位置在二維空間中的分佈情況(在〜100m矩形中)。您還可以將它與「date_histogram」聚合相結合,並查看點是如何及時分配的。 – Val

回答

1

爲了使它工作,你需要修改你的映射是這樣的:那麼

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)很容易。

下面是爲了格式化每個事件的過程,如我在最初的答案中所述。

  1. 使用http_poller可以檢索我設置的時間間隔爲1天JSON位置(注意,但你可以改變一些其他的價值,或者乾脆運行Logstash手動要檢索的每一次位置)
  2. 然後我們split的位置排列成單獨的事件
  3. 然後我們由10,000,000劃分緯度/經度字段,以獲取正確的座標
  4. 我們還需要通過移動和刪除某些領域
  5. 把它清理乾淨一點
  6. 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 

當已經運行,你可以啓動你的搜索查詢,你應該得到你的期望。

+0

謝謝瓦爾太棒了!獲取每個桶中所有timestamMs的列表並非微不足道? – user894199

+0

你想每個時間戳,或者你想按分鐘,小時,天分組他們,並簡單地得到多少有組? – Val

+0

嗨瓦爾,關於分組的好主意。如果可以在一週中的某一天,小時和15分鐘的時間內對它們進行分組,那就太棒了!例如星期一06 15-29:3意味着在上午6:15和上午6:29之間的任何一個星期一有3次事件,但我認爲這很難? – user894199