Elasticsearch:聚合在用户定义的存储区集上?

时间:2015-05-01 00:54:31

标签: elasticsearch

假设我想对服务器日志索引进行聚合,我想要移动和非移动设备的单独结果。即如果浏览器类型在某个列表中,则将结果放入移动存储桶中,否则将结果放入非移动存储桶中。

我尝试过这样的事情:(包括对浏览器类型的直接细分以进行比较)

{
    "aggs": {
        "group_by_mobility": {
            "filters": {
                "filters": {
                    "mobile": {
                        "terms": {
                            "browser.os.family": [
                                "Android",
                                "iOS",
                                "Windows Phone",
                                "Blackberry OS"
                            ]
                        }
                    },
                    "non-mobile": {
                        "not": {
                            "terms": {
                                "browser.os.family": [
                                    "Android",
                                    "iOS",
                                    "Windows Phone",
                                    "Blackberry OS"
                                ]
                            }
                        }
                    }
                }
            }
        },
        "group_by_browser": {
            "terms": {
                "field": "browser.os.family",
                "size": 0
            }
        }
    },
    "size": 0
}

这样运行,但答案看起来并不正确。我得到了第一个聚合:

"group_by_mobility" : {
    "buckets" : {
        "mobile" : {
        "doc_count" : 122250
        },
        "non-mobile" : {
            "doc_count" : 711658
        }
    }
}

如果我在移动浏览器的第二个聚合输出中添加数字,我会得到122404,它位于同一个球场。但是,所有其他浏览器类型的总和是304177,这远不及711658。

我采取了错误的做法吗?感谢任何提示。

1 个答案:

答案 0 :(得分:0)

您想要的是运行2个单独的聚合,每个聚合都有不同的筛选条件。这是伪代码:

GET index1/type1/_search
{
  "size": 0,
  "aggs": {
    "ag1": {
      "filter": {
        "terms": {
          "authInput.address.address1": [
            "Android",
            "iOS",
            "Windows Phone",
            "Blackberry OS"
          ]
        }
      },
      "aggs": {
        "ag1.terms1": {
          "terms": {
            "field": "authInput.address.address1",
            "size": 10
          }
        }
      }
    },
    "ag2": {
      "filter": {
        "not": {
          "filter": {
            "terms": {
              "authInput.address.address1": [
                "Android",
                "iOS",
                "Windows Phone",
                "Blackberry OS"
              ]
            }
          }
        }
      },
      "aggs": {
        "ag2.terms1": {
          "terms": {
            "field": "authInput.address.address1",
            "size": 10
          }
        }
      }
    }
  }