是否有可能弄清楚用户是否'是漫游'

时间:2015-11-18 22:06:23

标签: elasticsearch

我有一个问题是,是否可以编写查询来确定user是{是roaming

我的type usershome geo location curl -XGET "xxxxxxxxx/users/_mapping?pretty=true" { "xxxxx" : { "mappings" : { "users" : { "properties" : { .... "location" : { "type" : "geo_point" }, .... } } } } } 我还有type clicks geo location点击发生的地点和发生的时间(eventTimestamp)。 clicks也被设置为users的孩子:

curl -XGET "xxxxxx/clicks/_mapping?pretty=true" { "xxxxx" : { "mappings" : { "clicks" : { "_parent" : { "type" : "users" }, "_routing" : { "required" : true }, "properties" : { .... "eventTimestamp" : { "type" : "date", "format" : "dateOptionalTime" }, "location" : { "type" : "geo_point" }, .... } } } } } 我感兴趣的是获取过去home位置之外的所有用户x days。 当我说在他们的home位置之外时,我们可以说,距他们的home geo半径不到250米。

任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我认为你需要做两个查询来完成这个任务。首先,为所有用户运行简单查询。然后迭代结果,并为每个用户执行查询,查看使用过滤器检查eventTimestamp是否大于x天前的日期,以及geo_distance_range过滤器来测试大于的点击位置来自当前用户的250mi。第二个查询可能如下所示:

{
  "query": {
     "filtered": {
       "query": {"match_all": {}},
       "filter": {
         "and": [
           {
             "range": {
               "eventTimestamp": {"gte": "2015-11-01"}
             }
           },
           {
             "geo_distance_filter": {
               "gte": "250mi",
               "location": {
                 "lat": <latitude from current user>,
                 "lon": <longitude from current user>
               }
             }
           }
         ]
       }
     }
  }
}

您必须使用两个查询的原因是Elasticsearch无法在不使用脚本的情况下比较两个字段。当然,您可以尝试使用脚本......但我不确定是否可以通过脚本计算地理距离。

另一种选择是在第一个查询中包含eventTimestamp过滤(使用has_child查询来检查在给定日期之后进行的点击)。然后再次迭代这些结果,并仅通过geo_distance_range过滤此时间。

希望这有帮助!