ElasticSearch高级聚合

时间:2017-03-09 19:43:59

标签: elasticsearch

我目前的文档索引具有以下结构:

"ProductInteractions": {
    "properties": {
        "SKU": {
            "type": "string"
        },
        "Name": {
            "type": "string"
        },
        "Sources": {
            "properties": {
                "Source": {
                    "type": "string"
                },
                "Type": {
                    "type": "string"
                },
            }
        }
    }
}

我想在搜索此类型时聚合结果。我最初只想要Source字段中的术语,这很容易。我刚刚为terms字段使用了Source聚合。

现在我想聚合Type字段。但是,类型与来源有关。例如,我可以这样有两个Sources

{
    "Source": "The Store",
    "Type": "Purchase"
}

{
    "Source": "The Store",
    "Type": "Return"
}

我想展示每种不同来源的不同类型及其数量。换句话说,我希望我的回答是这样的:

{
    "aggs": {
        "Sources": [
            {
                "Key": "The Store",
                "DocCount": 2,
                "Aggregations": {
                    "Types": [
                        {
                            "Key": "Purchase",
                            "DocCount": 1
                        },
                        {
                            "Key": "Return",
                            "DocCount": 1
                        }
                    ]
                }
            }
        ]
    }
}

有没有办法获得这些子聚合?

1 个答案:

答案 0 :(得分:1)

是的,但是您需要稍微更改映射以使字段“not_analyzed”。

"ProductInteractions": {
    "properties": {
        "SKU": {
            "type": "string"
        },
        "Name": {
            "type": "string"
        },
        "Sources": {
            "properties": {
                "Source": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "Type": {
                    "type": "string",
                    "index": "not_analyzed"
                },
            }
        }
    }
}

然后您可以使用以下聚合来获得您想要的内容:

{
  "aggs": {
    "sources": {
      "terms": {
        "field": "Sources.Source"
      },
      "aggs": {
        "types": {
          "terms": {
            "field": "Sources.Type"
          }
        }
      }
    }
  }
}