elasticsearch 如何对一段时间内的文档大小求和?

guicsvcw  于 2023-02-11  发布在  ElasticSearch
关注(0)|答案(1)|浏览(144)

我试图估计的总大小的n个文档在整个索引使用下面的查询:

GET /events/_search
{
  "query": {
            "bool":{
                    "must": [
                        {"range": {"ts": {"gte": "2022-10-10T00:00:00Z", "lt": "2022-10-21T00:00:00Z"}}}
                    ]
                }
        },
  "aggs": {
    "total_size": {
"sum": {
        "field": "doc['_source'].bytes"
      }
    }
  }
}

这将返回文档,但聚合的大小为0:

"aggregations" : {
    "total_size" : {
      "value" : 0.0
    }
  }

如何对一段时间内的文档大小求和?

cczfrluj

cczfrluj1#

实现所需目的的最佳方法是实际添加另一个包含索引时真实的源大小的字段。
但是,如果您想运行一次来查看它的效果,可以在搜索时利用运行时字段来计算它,但要知道,它可能会给集群带来沉重的负担。由于Painless脚本语言还没有提供将源文档转换为索引时发送的JSON的方法,我们只能通过字符串化_source哈希Map来近似您要查找的值,生成以下内容:

GET /events/_search
{
  "runtime_mappings": {
    "source.size": {
      "type": "double",
      "script": """
        def size = params._source.toString().length() * 8;
        emit(size);
      """
    }
  },
  "query": {
        "bool":{
                "must": [
                    {"range": {"ts": {"gte": "2022-10-10T00:00:00Z", "lt": "2022-10-21T00:00:00Z"}}}
                ]
            }
  },
  "aggs": {
    "size": {
      "sum": {
        "field": "source.size"
      }
    }
  }
}

另一种方法是安装Mapper size plugin,以便可以利用在索引时计算的_size字段。

相关问题