弹性搜索2.1:聚合的交集

时间:2016-01-28 04:23:48

标签: elasticsearch aggregate

我在弹性搜索中有一些示例数据,如下所示

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个过滤器。

1 个答案:

答案 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
     }
   }
  }
 }

希望它有所帮助。