elasticsearch通过子聚合doc_count排除聚合桶

时间:2014-04-30 23:57:35

标签: elasticsearch

我认为用查询解释会更容易。考虑一下我的问题:

GET _search
{
   "aggs": {
      "group_by_app": {
         "terms": {
            "field": "application"
         }
      },
      "aggs": {
         "installs": {
            "filter": {
               "fquery": {
                  "query": {
                     "match": {
                        "action": "install"
                     }
                  },
                  "_cache": true
               }
            }
         },
         "launches": {
             "filter": {
               "fquery": {
                  "query": {
                     "match": {
                        "action": "launch"
                     }
                  },
                  "_cache": true
               }
            }
         }
      }
   }
}

这会返回以下结果:

"aggregations": {
      "apps": {
         "buckets": [
            {
               "key": "app1",
               "doc_count": 2313,
               "launches": {
                  "doc_count": 0
               },
               "installs": {
                  "doc_count": 48
               }
            },
            {
               "key": "app2",
               "doc_count": 5,
               "launches": {
                  "doc_count": 0
               },
               "installs": {
                  "doc_count": 0
               }
            },
         ]
     }
}

现在,如果您注意到,app2的安装和启动均为0。如果两个子聚合都启动并且安装都为0,我不希望将key =“app2”的桶显示在结果中。

我看到了min_doc_count并想知道是否有可能为我的案件做类似的事情?

[编辑]:我认为我可以尝试的另一件事是,而不是为每个可能的“动作”进行聚合“group_by_app”,如果我可以仅通过“action”=“install”或“action”聚合它“=”发射“。所以基本上我的意思是桶聚合仅在“action”=“launch”或“install”之上,并且子聚合在查询中基本相同。我可以在桶聚合上执行min_doc_count以不显示子聚合结果。但是,聚合仅允许术语/术语或过滤器,而不是两者。如果有人可以提出另一种方法来实现这一点,即使这将是一个很大的帮助!

1 个答案:

答案 0 :(得分:1)

我意识到这并不困难。我可以使用" query"而不是尝试在聚合中过滤。限制我聚合的文件。因此,不是聚合所有"应用程序"的所有文档。每一个"动作",只聚合所有" aplication"的文件。只有两个"动作",即"动作" ="安装"或"行动" ="启动",然后在桶聚合上执行min_doc_count = 1将不会显示" application"如果两者都安装"安装"和"发布"子聚合为0。

这是完整的查询:

GET _search
{
    "query": {
        "filtered": {
           "filter": {
               "bool": {
                   "must": [
                      {
                          "fquery": {
                             "query": {
                                "match": {
                                   "action": "install OR launch"
                                }
                             },
                             "_cache": true
                          }
                      }
                   ]
               }
           }
        }
    }, 
   "aggs": {
      "group_by_app": {
         "terms": {
            "field": "application"
         }
      },
      "aggs": {
         "installs": {
            "filter": {
               "fquery": {
                  "query": {
                     "match": {
                        "action": "install"
                     }
                  },
                  "_cache": true
               }
            }
         },
         "launches": {
             "filter": {
               "fquery": {
                  "query": {
                     "match": {
                        "action": "launch"
                     }
                  },
                  "_cache": true
               }
            }
         }
      }
   }
}