Elasticsearch,如何返回两个字段的唯一值?

6

我有一个包含20个不同字段的索引。我需要能够提取出“cat”和“sub”字段组合唯一的文档。 在SQL中,它看起来像这样:从表A中选择唯一的cat、sub; 我可以使用以下方式对一个字段进行操作:

{
"size": 0,
"aggs" : {
    "unique_set" : {
        "terms" : { "field" : "cat" }
    }
}}

但是我如何添加另一个字段以跨两个字段检查唯一性呢?
谢谢。
3个回答

4

使用复合聚合可以模拟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
  }
]

1

解决这个问题的唯一方法可能是嵌套聚合:

{
"size": 0,
    "aggs" : {
        "unique_set_1" : {

            "terms" : {
                     "field" : "cats"
            },
            "aggregations" : { 
                "unique_set_2": {
                    "terms": {"field": "sub"}
                }
            }
        }
    }

}

谢谢您的回复。我尝试按照您提出的方式运行它,但是我无法理解数据。我怎么知道唯一集合的总计数是多少? - epipko

-3

引用:

我需要能够提取唯一的文档,其中“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"
            }
        }
    }
}

另一种解决方案:使用嵌套的术语聚合。


如果 Elastic 集群报告“脚本类型 [inline],操作 [aggs] 和语言 [groovy] 被禁用”,是否有任何替代方法? - blong
另一种选择是使用嵌套术语聚合。但是,再次强调,初始问题没有意义。 - Fuad Efendi
选择表A中唯一的猫和子项;返回唯一的配对,而不是包含唯一配对的唯一文档,但用户希望“能够提取唯一文档,其中…”-无意义。 - Fuad Efendi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接