假设我有以下数据:
{
"id":"1",
"name": "John",
"tag":"x"
},
{
"id": 2,
"name":"John",
"tag":"y"
},
{
"id": 3,
"name":"Jane",
"tag":"x"
}
我想获取同时具有tag =“x” 和 tag =“y”的文档数量(名称唯一)给定上述数据,查询应返回1,因为只有John有两个文档,其中包含两个必需的标签。
到目前为止,我所能做的是使用OR的查询(因此,tag =“x”或tag =“y”)将返回2。例如:
"aggs": {
"distict_count": {
"filter": {
"terms": {
"tag": [
"x",
"y"
]
}
},
"aggs": {
"agg_cardinality_name": {
"cardinality": {
"field": "name"
}
}
}
}
}
是否可以将其更改为使用和而不是或?
最佳答案
尝试将cardinality
放在agg之下,以获取正确的不同计数:
{
"size": 0,
"aggs": {
"distict_count": {
"filter": {
"terms": {
"tag": [
"x",
"y"
]
}
},
"aggs": {
"agg_terms": {
"terms": {
"field": "name"
},
"aggs": {
"agg_cardinality_name": {
"cardinality": {
"field": "name"
}
}
}
}
}
}
}
}
更正您可以将
cardinality
aggs与bucket_selector
结合使用,这将排除少于2个唯一标签的存储桶-即x 和 y:{
"size": 0,
"aggs": {
"distict_count": {
"filter": {
"terms": {
"tag": [
"x",
"y"
]
}
},
"aggs": {
"agg_terms": {
"terms": {
"field": "name"
},
"aggs": {
"agg_cardinality_tag2": {
"bucket_selector": {
"buckets_path": {
"unique_tags_count": "unique_tags_count"
},
"script": "params.unique_tags_count > 1"
}
},
"unique_tags_count": {
"cardinality": {
"field": "tag"
}
},
"unique_names_count": {
"cardinality": {
"field": "name"
}
}
}
}
}
}
}
}
关于elasticsearch - 根据不同文档中同一字段的不同值进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64331146/