Elasticsearch按嵌套元素的数量聚合

时间:2018-02-21 17:12:24

标签: elasticsearch

使用Elasticsearch 5.4我有一个包含嵌套字段的映射文档:

top_doc: {
  dynamic: 'strict',
  properties: {
    ...,
    versions: {
      type: 'nested',
      properties: { ... },
    }
  }
}

我想聚合版本属性。即。

"aggregations": {
  "version_count": {
    "buckets": [
      {
        "key": 0,
        "doc_count": 10
      },
      {
        "key": 5,
        "doc_count": 7
      },
      {
        "key": 10,
        "doc_count": 1
      }
    ]
  }
}

我已经看到各种帖子提到您需要使用脚本来执行此操作但我还没有能够使其工作,因为它只是为所有文档返回0:

{
  "aggs": {
    "versions_count": {
      "histogram": {
        "script": {
          "inline": "if (doc.containsKey('versions')) { doc['versions'].value.length; } else { return 0; }"
        },
        "interval": 5
      }
    }
  }
}

我怀疑它是由于文档不包含版本属性,也许是因为它嵌套了?如果我在没有doc.containsKey('versions')条件保护的情况下运行,请检查错误:

"type": "illegal_argument_exception",
"reason": "No field found for [versions] in mapping with types []"

即使所有其他字段都成功返回。

**尝试1 @Peter **

感谢@Peter虽然它还没有工作:

{
  "aggs": {
    "versions_nested": {
      "nested": {
        "path": "versions"
      },
      "aggs": {
        "versions_count": {
          "histogram": {
            "script": {
              "inline": "versions.value.length"
            },
            "interval": 5
          }
        }
      }
    }
  }
}

错误:

"type": "illegal_argument_exception",
"reason": "Variable [versions] is not defined."

我已经迭代了Python脚本中的所有文档,并且可以确认它们都具有versions属性。

1 个答案:

答案 0 :(得分:0)

我不是100%确定如何使用脚本,但通常对于嵌套文档aggs,您必须指定嵌套文档的路径以访问它的属性:

{
  "aggs": {
    "versions_nested": {
      "nested": { "path": "versions" },
      "aggs": { /*Nested properties can be accessed here using path.name, i.e. versions.value*/
      }
    }
  }
}