如何在Elasticsearch中获取文档大小(以字节为单位)

时间:2018-12-24 12:43:38

标签: elasticsearch

我是Elasticsearch的新手。我需要获取查询结果的文档大小。

示例:- this is a document. (19bytes). this is also a document. (24bytes) content:{"a":"this is a document", "b":"this is also a document"}(53bytes) 当我在ES中查询文档时。结果将得到上述文件。因此,两个文档的大小均为32bytes。结果,我需要32字节用于Elasticsearch。

2 个答案:

答案 0 :(得分:1)

您的文档只包含一个字段吗?我不确定这是否是您想要的100%,但是通常您可以计算字段的长度并将其与文档一起存储或在查询时进行计算(但这是一个缓慢的操作,如果可能,我会避免这样做)。

这是一个包含测试文档和字段长度计算的示例:

PUT test/_doc/1
{
  "content": "this is a document."
}

POST test/_update_by_query
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "content_length"
          }
        }
      ]
    }
  },
  "script": {
    "source": """ 
if(ctx._source.containsKey("content")) {
  ctx._source.content_length = ctx._source.content.length();
} else {
  ctx._source.content_length = 0;
}
"""
  }
}

GET test/_search

查询结果为:

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "content" : "this is a document.",
          "content_length" : 19
        }
      }
    ]
  }
}

顺便说一句,它有19个字符(其中包括空格和点)。如果要排除这些,则必须向脚本添加更多逻辑。我会对字节BTW保持谨慎,因为UTF8每个字符可能会使用一个以上的字节(例如höhe),并且此脚本实际上仅在计算字符。

然后,您可以轻松地在查询和聚合中使用长度。

如果要计算合并的所有子文档的大小,请使用以下命令:

PUT test/_doc/2
{
  "content": {
    "a": "this is a document",
    "b": "this is also a document"
  }
}

POST test/_update_by_query
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "content_length"
          }
        }
      ]
    }
  },
  "script": {
    "source": """
if(ctx._source.containsKey("content")) {
  ctx._source.content_length = 0;
  for (item in ctx._source.content.entrySet()) {
    ctx._source.content_length += item.getValue().length();
  }
}
"""
  }
}

GET test/_search

请注意,content可以是文本类型,也可以有子文档,但是不能混用。

答案 1 :(得分:0)

无法通过API获取elasticsearch文档的大小。原因是,索引到Elasticsearch的文档在索引中的大小不同,这取决于您是否存储_all,索引哪些字段以及这些字段的映射类型,doc_value等。 Elasticsearch还使用重复数据删除和其他压缩方法,因此索引大小与其包含的原始文档没有线性关系。

解决该问题的一种方法是在编制索引之前预先计算文档大小,然后将其添加为文档中的另一个字段,即doc_size字段。然后您可以查询此计算字段,并对其进行汇总。

但是请注意,如上所述,这并不代表索引的大小,并且可能是完全错误的-例如,如果所有文档都包含一个具有相同值的很长的文本字段,那么Elasticsearch只会存储该长度值一次并对其进行引用,因此索引大小将小得多。