我有一个包含20个不同字段的索引。我需要能够提取出“cat”和“sub”字段组合唯一的文档。 在SQL中,它看起来像这样:从表A中选择唯一的cat、sub; 我可以使用以下方式对一个字段进行操作:
{
"size": 0,
"aggs" : {
"unique_set" : {
"terms" : { "field" : "cat" }
}
}}
但是我如何添加另一个字段以跨两个字段检查唯一性呢?
谢谢。
我有一个包含20个不同字段的索引。我需要能够提取出“cat”和“sub”字段组合唯一的文档。 在SQL中,它看起来像这样:从表A中选择唯一的cat、sub; 我可以使用以下方式对一个字段进行操作:
{
"size": 0,
"aggs" : {
"unique_set" : {
"terms" : { "field" : "cat" }
}
}}
使用复合聚合可以模拟SQL中的SELECT DISTINCT [cat], [sub]
操作。
{
"size": 0,
"aggs": {
"cat_sub": {
"composite": {
"sources": [
{ "cat": { "terms": { "field": "cat" } } },
{ "sub": { "terms": { "field": "sub" } } }
]
}
}
}
}
Returns...
"buckets" : [
{
"key" : {
"cat" : "a",
"sub" : "x"
},
"doc_count" : 1
},
{
"key" : {
"cat" : "a",
"sub" : "y"
},
"doc_count" : 2
},
{
"key" : {
"cat" : "b",
"sub" : "y"
},
"doc_count" : 3
}
]
解决这个问题的唯一方法可能是嵌套聚合:
{
"size": 0,
"aggs" : {
"unique_set_1" : {
"terms" : {
"field" : "cats"
},
"aggregations" : {
"unique_set_2": {
"terms": {"field": "sub"}
}
}
}
}
}
引用:
我需要能够提取唯一的文档,其中“cat”和“sub”字段的组合是唯一的。
这是无意义的;您的问题不清楚。您可以有10个唯一的配对{cat,sub},100个唯一的三元组{cat,sub,field_3},以及1000个唯一的文档Doc {cat,sub,field3,field4,...}。
如果您对每个唯一配对{"Category X","Subcategory Y"}的文档计数感兴趣,则可以使用基数聚合。对于两个或更多字段,您将需要使用脚本,这将带来性能损失。
示例:
{
"aggs" : {
"multi_field_cardinality" : {
"cardinality" : {
"script": "doc['cats'].value + ' _my_custom_separator_ ' + doc['sub'].value"
}
}
}
}
另一种解决方案:使用嵌套的术语聚合。