繁体   English   中英

具有多个查询的 ElasticSearch 基数聚合

[英]ElasticSearch cardinality aggregation with multiple query

我有一个包含商家和物品的文件。 我的文件看起来很像

{
  "merchant": "M1",
  "item": "I1"
}

对于给定的商家名称列表,我想获取每个商家的独特商品数量。

我能够通过以下查询获得给定商家的独特商品数量:

{
    "size": 0,
    "query": {
        "match": {
            "merchant": "M1"
        }
    },
    "aggs": {
        "count_unique_items": {
            "cardinality": {
                "field": "I1"
            }
        }
    }
}

有没有办法扩展这个查询,而不是 1 个商家,我可以用一个查询搜索 N 个商家?

您需要使用条款查询来匹配多个商家,并使用多级聚合来查找每个商家的唯一计数。 因此,为商家创建一个条款聚合,然后将基数聚合作为子聚合添加到条款聚合。 查询将如下所示:

{
  "size": 0,
  "query": {
    "terms": {
      "merchant": [
        "M1",
        "M2"
      ]
    }
  },
  "aggs": {
    "merchent": {
      "terms": {
        "field": "merchant"
      },
      "aggs": {
        "item_count": {
          "cardinality": {
            "field": "item"
          }
        }
      }
    }
  }
}

正如@Opster ES Ninja Nishant 所建议的,您需要使用多级聚合。

添加包含索引数据、搜索查询和搜索结果的工作示例

指数数据:

{
  "merchant": "M3",
  "item": ["I3","I2"]
}
{
  "merchant": "M2",
  "item": ["I2","I2"]
}
{
  "merchant": "M1",
  "item": "I1"
}

搜索查询:

要计算给定merchant的唯一item数,在基数聚合中而不是I1 ,您应该使用item字段

{
  "size":0,
  "query": {
    "terms": {
      "merchant.keyword": [
        "M1",
        "M2",
        "M3"
      ]
    }
  },
  "aggs": {
    "merchent": {
      "terms": {
        "field": "merchant.keyword"
      },
      "aggs": {
        "item_count": {
          "cardinality": {
            "field": "item.keyword"       <-- note this
          }
        }
      }
    }
  }
}

搜索结果:

"aggregations": {
    "merchent": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "M1",
          "doc_count": 1,
          "item_count": {
            "value": 1
          }
        },
        {
          "key": "M2",
          "doc_count": 1,
          "item_count": {
            "value": 1
          }
        },
        {
          "key": "M3",
          "doc_count": 1,
          "item_count": {
            "value": 2
          }
        }
      ]
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM