2017-09-12 41 views
0

我努力想出了这一个。我有时间和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。

+0

我在报告中对此做了说明。使用'必须'不起作用。它没有返回结果。 – Andrew

+0

哦,我现在看到了。我认为你可以使用水桶选择器管道聚合 你可以看到它[这里](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation的.html)。 语法有点杂乱,但它会做的工作 – tomas

+0

要求一个比弹性搜索链接提供的更好的例子太多了吗?我是否需要创建单独的过滤器/术语(例如:在一个位置过滤/在ID上聚合)?因此在我的情况下,我会有loc1和loc2?那么使用bucket_selector来计算交集? 我将如何使脚本工作? – Andrew

回答

0

得到了答案!

"aggs": { 
    "ids": { 
    "terms": { 
     "field": "ID" 
    }, 
    "aggs": { 
    "the_filter": { 
     "bucket_selector": { 
     "buckets_path": { 
      "the_doc_count": "_count" 
     }, 
     "script": "params.the_doc_count >= 2" 
     } 
     } 
    } 
    } 
} 
+0

我尝试了这一点,但我不知道脚本部分将工作。具体而言,查找_count> = 2。看起来这可能工作,如果记录出现在一个范围内只有一次。但随着时间的推移,记录可能会出现在相同的范围内多次。它就像我需要挖掘每个位置的结果,然后从那里执行某种联合/交集? – Andrew

+0

我认为你必须改变你的数据索引方式来解决这个问题 – tomas