Elasticsearch按字段名称聚合

时间:2018-11-19 15:12:46

标签: elasticsearch

想象两个文档:

[
    {
        "_id": "abc",
        "categories": {
            "category-id-1": 1,
            "category-id-2": 50
        }
    },
    {
        "_id": "def",
        "categories": {
            "category-id-1": 2
        }
    }
]

如您所见,通过在categories字段中设置嵌套字段,可以将每个文档与许多类别相关联。

通过这种映射,我应该能够从已定义的类别中请求文档,并通过设置为该字段值的值对它们进行排序。

我的问题是我现在想进行汇总以针对每个类别计算文档数。这将为我提供的数据集提供以下结果:

{
    "aggregations": {
        "categories" : {
            "buckets": [
                {
                    "key": "category-id-1",
                    "doc_count": 2
                },
                {
                    "key": "category-id-2",
                    "doc_count": 1
                }
            ]
        }
    }
}

我在文档中找不到任何解决此问题的方法。我是ElasticSearch的新手,所以我可能在文档研究或映射选择方面做错了事情。

是否可以通过我的映射进行这种聚合?我正在使用ES 6.x

编辑:这是索引的映射:

{
  "test1234": {
    "mappings": {
      "_doc": {
        "properties": {
          "categories": {
            "properties": {
              "category-id-1": {
                "type": "long"
              },
              "category-id-2": {
                "type": "long"
              }
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

最直接的解决方案是使用一个新字段,其中包含文档的所有不同类别。

如果我们将此字段称为categories_list,则可能是一种解决方案:

将映射更改为

{
  "test1234": {
    "mappings": {
      "_doc": {
        "properties": {
          "categories": {
            "properties": {
              "category-id-1": {
                "type": "long"
              },
              "category-id-2": {
                "type": "long"
              }
            }
          },
          "categories_list": {
             "type": "keyword"
          }
        }
      }
    }
  }
}

然后,您需要像这样修改文档:

[
    {
        "_id": "abc",
        "categories": {
            "category-id-1": 1,
            "category-id-2": 50
        },
        "categories_list": ["category-id-1", "category-id-2"]
    },
    {
        "_id": "def",
        "categories": {
            "category-id-1": 2
        },
        "categories_list": ["category-id-1"]
    }
]

则您的汇总请求应为

{
  "aggs": {
    "categories": {
      "terms": {
        "field": "categories_list",
        "size": 10
      }
    }
  }
}

并将返回

"aggregations": {
    "categories": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "category-id-1",
          "doc_count": 2
        },
        {
          "key": "category-id-2",
          "doc_count": 1
        }
      ]
    }
  }