我有个搜索问题我不知道该怎么做。我的文档格式如下:
{
"timestamp":"2015-03-17T15:05:04.563Z",
"session_id":"1",
"user_id":"jan"
}
假设会话ID的第一个时间戳是“登录”,最后一个时间戳是“注销”。我想有所有的“登录”和“注销”所有会话的文档(如果可能的话,按user_id
排序)。我设法通过聚合获得了正确的时间戳:
{
"aggs" : {
"group_by_uid" : {
"terms" : {
"field" : "user_id"
},
"aggs" : {
"group_by_sid" : {
"terms" : {
"field" : "session_id"
},
"aggs" : {
"max_date" : {
"max": { "field" : "timestamp" }
},
"min_date" : {
"min": { "field" : "timestamp" }
}
}
}
}
}
}
}
但是我如何获得相应的文档?我也不介意如果我必须做2搜索(一个为登录和注销之一)。我尝试托姆tophits聚合和排序的东西,但我总是得到解析错误:/
希望有人能给予我一点提示:)
最好的问候,简
2条答案
按热度按时间vfh0ocws1#
这里有一个基于Sloan Ahrens提出的方法的单次搜索解决方案。优点是开始和结束会话条目在同一个桶中。
干杯,简
6ljaweal2#
你已经很接近了。这样吧使用两个搜索,每个搜索都以您所做的方式进行聚合,但也会得到第一个
top_hit
,并在"timestamp"
上进行排序。我只是建立了一个基本的索引,并添加了一些数据,看起来像你发布的:
然后我可以通过以下方式获取每个会话的开始时间:
和结束时间:
下面是我使用的代码:
http://sense.qbox.io/gist/05edb48b840e6a992646643913db8ef0a3ccccb3