[英]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.