聚合弹性搜索5

时间:2017-03-16 04:00:30

标签: elasticsearch elasticsearch-aggregation

在我的弹性搜索索引中有以下类型的条目。

{
  "_index": "employees",
  "_type": "employee",
  "_id": "10000",
  "_score": 1.3640093,
  "_source": {
    "itms": {
      "depc": [
        "IT",
        "MGT",
        "FIN"
      ],
      "dep": [
        {
          "depn": "Information Technology",
          "depc": "IT"
        },
        {
          "depn": "Management",
          "depc": "MGT"
        },
        {
          "depn": "Finance",
          "depc": "FIN"
        },
        {
          "depn": "Finance",
          "depc": "FIN"
        }
      ]
    }
  }
}

现在我试图获得唯一的部门列表,包括部门代码(depc)和部门名称(depn)。

我正在尝试跟随,但它没有给出我预期的结果。

{
  "size": 0,
  "query": {},
  "aggs": {
    "departments": {
      "terms": {
        "field": "itms.dep.depc",
        "size": 10000,
        "order": {
          "_term": "asc"
        }
      },
      "aggs": {
        "department": {
          "terms": {
            "field": "itms.dep.depn",
            "size": 10
          }
        }
      }
    }
  }
}

任何建议都表示赞赏。

谢谢你

1 个答案:

答案 0 :(得分:1)

从您的agg查询中,itms.dep的映射类型似乎是对象而不是nested

  

Lucene没有内部对象的概念,所以Elasticsearch会变平   将对象层次结构转换为字段名称和值的简单列表。

因此,您的文档已内部转换为:

{
  "depc" :        ["IT","MGT","FIN"],
  "dep.depc" : [ "IT","MGT","FIN"],
  "dep.depn" :  [ "Information Technology", "Management", "Finance" ]
}

即。您已失去depcdepn

之间的关联

解决此问题:

  1. 您需要将对象类型更改为嵌套
  2. 使用nested aggregation
  3. 您现有的agg查询的结构对我来说似乎不错,但您必须将其转换为映射更新后的嵌套聚合