Elasticsearch嵌套基数聚合

时间:2016-12-07 05:24:07

标签: elasticsearch aggregation

我有一个嵌套模式的映射,我想在嵌套字段上进行聚合,并按照docid计数进行排序。

select name, count(distinct docid) as uniqueid from table
group by name
order by uniqueid desc 

以上就是我想做的事。

{
   "size": 0,
   "aggs": {
      "samples": {
         "nested": {
            "path": "sample"
         },
         "aggs": {
            "sample": {
               "terms": {
                  "field": "sample.name",
        "order": {
                     "DocCounts": "desc"
                  }
               },
               "aggs": {
                  "DocCounts": {
                     "cardinality": {
                        "field": "docid"              
                     }
                  }
               }
            }
         }
      }
   }
}

但在结果中我没有得到预期的输出

结果:

"buckets": [
               {
                  "key": "xxxxx",
                  "doc_count": 173256,
                  "DocCounts": {
                     "value": 0
                  }
               },
               {
                  "key": "yyyyy",
                  "doc_count": 63,
                  "DocCounts": {
                     "value": 0
                  }
               }
]

我得到了DocCounts = 0。这不是预期的。我的查询出了什么问题。

3 个答案:

答案 0 :(得分:1)

我认为您上一次嵌套的aggregation太多了。试着摆脱它:

{
  "size": 0,
  "aggs": {
    "samples": {
      "nested": {
        "path": "sample"
      },
      "aggs": {
        "sample": {
          "terms": {
            "field": "sample.name",
            "order": {
              "DocCounts": "desc"
            }
          },
          "DocCounts": {
            "cardinality": {
              "field": "docid"
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:1)

一般情况下,当通过上限作用域对值进行嵌套类型的聚合时,我们发现在存储文档时我们需要将嵌套类型的值从上层作用域中复制/复制。

然后在你的情况下聚合看起来像:

"aggs": {
  "DocCounts": {
    "cardinality": {
       "field": "sample.docid"              
    }
  }
}

至少在Elasticsearch的1.7版本中适用于这种情况。

答案 2 :(得分:0)

您可以在DocCounts上的基数聚合之上使用反向嵌套聚合。这是因为当应用嵌套聚合时,查询将针对嵌套文档运行。因此,要访问嵌套doc中的父文档的任何字段,可以使用反向嵌套聚合。请查看ES Reference以获取更多相关信息。

您的基数查询将如下所示:

"aggs": {
    "internal_DocCounts": {
        "reverse_nested": { },
        "DocCounts": {
            "cardinality": {
                "field": "docid"
            }
        }
    }
}

响应如下:

  "buckets": [
  {
    "key": "xxxxx",
    "doc_count": 173256,
    "internal_DocCounts": {
      "doc_count": 173256,
      "DocCounts": {
        "value": <some_value>
      }
    }
  },
  {
    "key": "yyyyy",
    "doc_count": 63,
    "internal_DocCounts": {
      "doc_count": 63,
      "DocCounts": {
        "value": <some_value>
      }
    }
  },
  .....

选中此similar thread