在弹性搜索中,我有一个索引,其中包含用户和他们访问过的网址。我希望能够搜索多个用户,并找到他们访问过的常见网址。
我可以抓取单个用户的网址:
{
"size": 0,
"query": {
"filtered": {
"query": {
"query_string": {
"query": "user:bob"
}
},
"filter": {
"bool": {
"must": [{
"range": {
"@timestamp": {
"gte": 1430456930549,
"lte": 1430666630549
}
}
}],
"must_not": []
}
}
}
},
"aggs": {
"1": {
"terms": {
"field": "url",
"size": 0,
"order": {
"_count": "desc"
}
}
}
}
}
但是如何组合每个用户的结果(做某种交集)。我可以通过编程方式执行此操作,但Elastic Search可以通过某种聚合来执行此操作吗?
答案 0 :(得分:1)
您可以在用户的术语中使用子聚合,术语:
{
"query": {
"match_all": {}
},
"aggs": {
"users": {
"terms": {
"field": "user"
},
"aggs": {
"urls": {
"terms": {
"field": "url"
}
}
}
}
}
}
这将为您提供一些用户,每个用户都包含网址桶。
UPD 我一开始误解了你的问题。我不知道你正在寻找的这种类型的聚合。但是,您可以利用significant terms aggregation:
{
"query": {
"filtered": {
"filter": {
"terms": {
"user": ["alice", "jack"]
}
}
}
},
"aggs": {
"urls": {
"significant_terms": {
"field": "url",
"size": 5
}
}
}
}
这将为您提供在给定用户集中最受欢迎网址的存储桶。请注意,在任何情况下,它都不是严格的交集,而是一个列表,其中顶部元素是在所谓的前景组(查询范围)中比在背景组(索引的所有文件)。
选定用户常见的网址很可能在此聚合中获得高分。
但是,如果2个请求的用户中的每一个都比其他网站更多地访问自己喜欢的网站,并且根本不访问其他用户最喜欢的网站,则两个网址仍然会出现,并且得分会高于普通网站。 / p>
一般来说,我建议探索这种聚合,它可以从数据中提供一些有趣的见解。例如,您的数据集中此聚合的更多相关用法将是查找某些其他网站的访问者之间常见的网站。