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

时间:2015-07-13 21:38:59

标签: elasticsearch distinct

我有一个包含20个不同字段的索引。我需要能够提取独特的文档,其中字段“cat”和“sub”的组合是唯一的。 在SQL中它看起来是这样的:从表A中选择唯一的cat,sub; 我可以通过这种方式为一个领域做到这一点:

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

但是如何添加另一个字段来检查两个字段的唯一性?

谢谢,

3 个答案:

答案 0 :(得分:1)

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

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

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

}

答案 1 :(得分:0)

SQL的SELECT DISTINCT [cat], [sub]可以用Composite Aggregation来模仿。

{
  "size": 0, 
  "aggs": {
    "cat_sub": {
      "composite": {
        "sources": [
          { "cat": { "terms": { "field": "cat" } } },
          { "sub": { "terms": { "field": "sub" } } }
        ]
      }
    }
  }
}

返回...

"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
  }
]

答案 2 :(得分:-1)

引用:

  

我需要能够提取独特的文档,其中“cat”和“sub”字段的组合是唯一的。

这是无稽之谈;你的问题不清楚。您可以拥有10个唯一对{cat,sub}和100个独特三元组{cat,sub,field_3}和1000个独特文档Doc {cat,sub,field3,field4,...}。

如果您对每个唯一对{“类别X”,“子类别Y”}的文档计数感兴趣,那么您可以使用基数聚合。对于两个或多个字段,您将需要使用脚本,这将带来性能损失。

示例:

{
    "aggs" : {
        "multi_field_cardinality" : {
            "cardinality" : {
                "script": "doc['cats'].value + ' _my_custom_separator_ ' + doc['sub'].value"
            }
        }
    }
}

替代解决方案:使用嵌套术语术语聚合。