为了使它工作,你需要修改你的映射是这样的:那么
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