【问题标题】:Aggregations elasticsearch 5聚合弹性搜索 5
【发布时间】:2017-03-16 12:19:22
【问题描述】:

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

{
  "_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
          }
        }
      }
    }
  }
}

欢迎提出任何建议。

谢谢你

【问题讨论】:

  • depc 是否可以有多个 depn,反之亦然?
  • 不可能

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

从您的 agg 查询来看,itms.dep 的映射类型似乎是 object 而不是 nested

Lucene 没有内部对象的概念,因此 Elasticsearch 扁平化 对象层次结构转换为一个简单的字段名称和值列表。

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

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

即你失去了depc 和depn 之间的关联

解决这个问题:

  1. 您需要将对象类型更改为嵌套
  2. 使用nested aggregation

您现有 agg 查询的结构对我来说似乎很好,但您必须在映射更新后将其转换为嵌套聚合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2019-11-08
    • 2021-02-19
    • 2023-03-18
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多