【问题标题】:Terms Aggregation based on Distinct Terms per Collection基于每个集合的不同术语的术语聚合
【发布时间】:2021-04-09 20:27:50
【问题描述】:

我有如下文件:

{
  "foo": null,
  "bars": [
    {
      "baz": "BAZ",
      "qux": null,
      "bears": [
        {
          "fruit": "banana"
        }
      ]
    }
  ]
}

我想要fruit 术语的存储桶,其中计算bars 下有多少文档包含bears,每个给定fruit。例如,给定以下文件:

{
  "foo": null,
  "bars": [
    {
      "baz": "BAZ",
      "qux": null,
      "bears": [
        {
          "fruit": "banana"
        },
        {
          "fruit": "banana"
        },
        {
          "fruit": "apple"
        }
      ]
    },
    {
      "baz": "BAZ",
      "qux": null,
      "bears": [
        {
          "fruit": "banana"
        }
      ]
    }
  ]
}
{
  "foo": null,
  "bars": [
    {
      "baz": "BAZ",
      "qux": null,
      "bears": [
        {
          "fruit": "apple"
        },
        {
          "fruit": "apple"
        },
        {
          "fruit": "orange"
        }
      ]
    }
  ]
}

我想要如下所示的结果:

"buckets": [
  {
    "key": "banana",
    "doc_count": 2
  },
  {
    "key": "apple",
    "doc_count": 2
  },
  {
    "key": "orange",
    "doc_count": 1
  }
]

即,banana 显示为 2 的后代,不同的 barsapple 出现为 2 的后代,不同的barsorange 出现为1 的后代不同的bar

现在我有以下聚合,计算总水果数:

{
  "aggs": {
    "global": {
      "global": {},
      "aggs": {
        "bars": {
          "nested": {
            "path": "bars"
          },
          "aggs": {
            "bears": {
              "nested": {
                "path": "bars.bears"
              },
              "aggs": {
                "fruits": {
                  "terms": {
                    "field": "bars.bears.fruit"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

这会导致以下结果:

"buckets": [
  {
    "key": "banana",
    "doc_count": 3
  },
  {
    "key": "apple",
    "doc_count": 3
  },
  {
    "key": "orange",
    "doc_count": 1
  }
]

这不是我想要的。是否可以修改此查询以计算包含每个 fruit 的不同 bars

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    添加一个带有索引数据(与问题所示相同)、映射、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "bars": {
            "type": "nested",
            "properties": {
              "bears": {
                "properties": {
                  "fruit": {
                    "type": "keyword"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    搜索查询:

    {
      "size": 0,
      "aggs": {
        "bars": {
          "nested": {
            "path": "bars"
          },
          "aggs": {
            "fruits": {
              "terms": {
                "field": "bars.bears.fruit"
              }
            }
          }
        }
      }
    }
    

    搜索结果:

    "aggregations": {
        "bars": {
          "doc_count": 3,
          "fruits": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "apple",
                "doc_count": 2
              },
              {
                "key": "banana",
                "doc_count": 2
              },
              {
                "key": "orange",
                "doc_count": 1
              }
            ]
          }
        }
      }
    

    【讨论】:

    • @knpwrs 请仔细阅读答案,如果这能解决您的问题,请告诉我?
    • @knpwrs 是我的答案中显示的搜索结果,与您期望得到的不同?我已经考虑了上面问题中给出的示例索引数据,具有不同的索引映射
    • 看起来它适用于该索引映射。我可能不得不回到绘图板上我在这里做的事情。谢谢!
    • 我当前的映射有熊嵌套在栏下(从我的原始查询中可以看到)。有没有办法同时使用这两种映射,还是我必须使用一个映射或另一个?
    【解决方案2】:

    我实际上设法得到了我正在寻找的结果,尽管形状略有不同:

    查询

    {
      "aggs": {
        "global": {
          "global": {},
          "aggs": {
            "bars": {
              "nested": {
                "path": "bars"
              },
              "aggs": {
                "bears": {
                  "nested": {
                    "path": "bars.bears"
                  },
                  "aggs": {
                    "fruits": {
                      "terms": {
                        "field": "bars.bears.fruit"
                      },
                      "fruit_to_bears": {
                        "reverse_nested": {}
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    结果

    "buckets": [
      {
        "key": "banana",
        "doc_count": 3,
        "fruit_to_bears": {
          "doc_count": 2
        }
      },
      {
        "key": "apple",
        "doc_count": 3,
        "fruit_to_bears": {
          "doc_count": 2
        }
      },
      {
        "key": "orange",
        "doc_count": 1,
        "fruit_to_bears": {
          "doc_count": 1
        }
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多