我努力想出了这一个。我有时间和GPS记录如下:ElasticSearch全球定位系统的交汇点
{ID: 1,Time:"2017-01-1",gps:{lat:38.00,lon:-79.00}},
{ID: 2,Time:"2017-01-1",gps:{lat:38.00,lon:-79.00}},
{ID: 1,Time:"2017-01-2",gps:{lat:39.00,lon:-77.00}},
{ID: 2,Time:"2017-01-2",gps:{lat:20.00,lon:-20.00}},
{ID: 1,Time:"2017-01-3",gps:{lat:20.00,lon:-20.00}},
{ID: 3,Time:"2017-01-1",gps:{lat:20.00,lon:-20.00}},
..........
我有一个地图,允许绘制圆和选择区域。目前,我可以轻松查询和汇总出现在任何所选位置的记录。这是一个例子:
{
"query": {
"bool": {
"should": [
{
"geo_distance": {
"distance": 56100.0,
"gps": {
"lat": 38,
"lon": -79
}
}
},
{
"geo_distance": {
"distance": 56100.0,
"gps": {
"lat": 39,
"lon": -77
}
}
}
]
}
},
"aggs": {
"by_record_id":{
"terms": {
"field": "id"
}
}
}
}
不过,我有点困惑就如何得到选择的交集。 (注意:圆圈不重叠)。从本质上讲,我希望有一个已经有两个圆圈出现gps值的记录集合,并删除只出现在一个或没有出现的记录。例如,对于上面的记录,我只想要ID = 1的聚合结果(因为ID = 2和ID = 3不出现在两个圆圈中)。
如果我将查询更改为{“query”:{“bool”:{“must”:[...]}}},我没有得到任何结果。因为很明显,没有记录同时出现在两个地点。
我已经尝试了许多不同的事情与查询,包括function_score(把每个位置的功能)和利用分数(根据不同的分数类型)。另外,我已经尝试了许多不同的聚合组合,包括使用top_hits,cardinality(with precision_threshold),bucket_selector和cardinality进行过滤。
这看起来超级简单,在SQL中很明显。请帮助一个elasticsearch nube。
我在报告中对此做了说明。使用'必须'不起作用。它没有返回结果。 – Andrew
哦,我现在看到了。我认为你可以使用水桶选择器管道聚合 你可以看到它[这里](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation的.html)。 语法有点杂乱,但它会做的工作 – tomas
要求一个比弹性搜索链接提供的更好的例子太多了吗?我是否需要创建单独的过滤器/术语(例如:在一个位置过滤/在ID上聚合)?因此在我的情况下,我会有loc1和loc2?那么使用bucket_selector来计算交集? 我将如何使脚本工作? – Andrew