我在弹性搜索中有一些示例数据,如下所示
Data1: {
"name": "rahul",
"socialnetwork": "facebook",
"day":1
}Data2: {
"name": "rahul",
"searchengine": "google"
"day": 1
}Data3: {
"name": "vivek",
"socialnetwork": "facebook",
"day":1
}Data4: {
"name": "devendra",
"searchengine": "google",
"day":2
}Data5: {
"name": "rahul",
"socialnetwork": "facebook",
"day":2
}
我需要在“name”字段上获取聚合,其中socialnetwork =“facebook”和searchengine =“google”。
据我所知,我们可以使用两个聚合并获得聚合的交集。
第一次聚合:
{
"query": {
"match": {
"searchengine": "google"
}
},
"aggs": {
"searcheng": {
"terms": {
"field": "name"
}
}
}
}
第二次聚合:
{
"query": {
"match": {
"socialnetwork": "facebook"
}
},
"aggs": {
"socialnet": {
"terms": {
"field": "name"
}
}
}
}
从两个聚合中获得公共聚合(即交集)。
但我无法使用弹性搜索获得交集。 我尝试了很多东西:在这种情况下,子聚合没有帮助,重要的术语聚合结果不够好,过滤器,管道聚合,但找不到解决方案。
以上示例数据只是大数据的简化版本,有两个以上的过滤器,大约有20个过滤器。
答案 0 :(得分:0)
不,你不需要有两个聚合的交集。
使用bool query
可以轻松实现上述目的。对于您想要的输出,您可以使用should
子句。
{
"query": {
"bool": {
"should": [
{
"match": {
"searchengine": "google"
}
},
{
"match": {
"socialnetwork": "facebook"
}
}
],
"minimum_number_should_match": 1
}
},
"aggs": {
"searcheng": {
"terms": {
"field": "name",
"min_doc_count" :2
}
}
}
}
希望它有所帮助。