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