【问题标题】:Elasticsearch: find documents with distinct values and then aggregate over themElasticsearch:查找具有不同值的文档,然后对它们进行聚合
【发布时间】:2015-06-05 04:59:33
【问题描述】:

我的索引具有类似日志的结构:每当事件发生时,我都会插入一个文档版本。例如,这里是索引中的文档:

{ "key": "a", subkey: 0 }
{ "key": "a", subkey: 0 }
{ "key": "a", subkey: 1 }
{ "key": "a", subkey: 1 }
{ "key": "b", subkey: 0 }
{ "key": "b", subkey: 0 }
{ "key": "b", subkey: 1 }
{ "key": "b", subkey: 1 }

我正在尝试在 ElasticSearch 中构造一个查询,它基本上等同于以下 SQL 查询:

SELECT COUNT(*), key, subkey
FROM (SELECT DISTINCT key, subkey FROM t)

这个问题的答案显然是

(1, a, 0)
(1, a, 1)
(1, b, 0)
(1, b, 1)

如何在 Elasticsearch 中复制此查询?我想出了以下几点:

GET test_index/test_type/_search?search_type=count
{
  "aggregations": {
    "count_aggr": {
      "terms": {
        "field": "concatenated_key"
      },
      "aggs": {
        "sample_doc": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }
}

concatenated_keykeysubkey 的串联。此查询将为每个(键、子键)组合创建一个存储桶,并从每个存储桶返回一个示例文档。但是,我不知道如何聚合_source 的字段。

将不胜感激任何想法。谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果您无法重新索引文档并添加您自己的连接键字段,这是一种方法:

    GET /my_index/my_type/_search?search_type=count
    {
      "aggs": {
        "key_agg": {
          "terms": {
            "field": "key",
            "size": 10
          },
          "aggs": {
            "sub_key_agg": {
              "terms": {
                "field": "subkey",
                "size": 10
              }
            }
          }
        }
      }
    }
    

    它会给你这样的东西:

         "buckets": [
            {
               "key": "a",
               "doc_count": 4,
               "sub_key_agg": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": 0,
                        "doc_count": 2
                     },
                     {
                        "key": 1,
                        "doc_count": 2
                     }
                  ]
               }
            },
            {
               "key": "b",
               "doc_count": 4,
               "sub_key_agg": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": 0,
                        "doc_count": 2
                     },
                     {
                        "key": 1,
                        "doc_count": 2
                     }
                  ]
               }
            }
         ]
    

    您拥有密钥的位置 - "key": "a" - 然后是与此密钥的每个组合以及与 key=a 和 subkey=0 或 key=a 和 subkey=1 匹配的文档数:

                 "buckets": [
                     {
                        "key": 0,
                        "doc_count": 2
                     },
                     {
                        "key": 1,
                        "doc_count": 2
                     }
                  ]
    

    另一个键也是如此。

    【讨论】:

    • 嗨,安德烈,感谢您的回答!我绝对可以添加一个连接键 - 请注意,我在原始问题中提到了它的用法。不幸的是,这并不是我的目标。我正在尝试计算(键,子键)的不同组合。您提供的查询将计数分解为所有组合,但仍提供原始计数(而不是不同计数 - 每个存储桶中应为 1)。
    • 我没有关注。那么,该计数何时会不同于 1?
    • 好吧,您可以在查询中看到 sub_key_agg 中每个存储桶的 doc_count 为 2。
    • 我不是在谈论我的查询,而是在谈论您的用例。对我而言,您的用例将始终有 1 个不同的组合,因此该数字将始终为 1。
    • 对不起,我会尝试重新解释一下自己。正如您在我在原始帖子中提供的数据示例中看到的那样,我有每个(键、子键)组合的两个文档。我想计算不同(键、子键)组合(在本例中为 4)的 total 数量。这是否使目的更明确?
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 2021-01-29
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多