我有一个问题是,是否可以编写查询来确定user
是{是roaming
。
我的type users
有home 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米。
任何建议都将受到高度赞赏。
答案 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
过滤此时间。
希望这有帮助!