2015-02-05 82 views

回答

9

_size mapping field,如果允许,应该给你的每个文件的大小是免费的。将此与avg聚合相结合应该可以得到你想要的。喜欢的东西:

{ 
    "query" : {"match_all" : {}}, 
    "aggs" : {"avg_size" : {"avg" : {"terms" : {"field" : "_size"}}}} 
} 
+0

我喜欢这个比我的回答更好:) –

+3

如果你想获得文档的大小,你需要指示ES来存储大小对于每个文档:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-size-field.html –

+0

除非您使用Elasticsearch 2.0或更早版本,否则不支持此功能。 – lucabelluccini

1

在黑暗中拍摄,但小面或聚合与脚本结合可能会做到这一点。

{ 
    ..., 

    "aggs" : { 
     "avg_length" : { "avg" : { "script" : "doc['_all'].length" } } 
    } 
} 
+0

这实际上失败[email protected]f59))],从[0],大小[10]:查询失败[无法执行主查询]];嵌套:GroovyScriptExecutionException [MissingPropertyException [为org.elasticsearch.index.fielddata.ScriptDocValues $字符串评估属性“长度”的异常,原因:groovy.lang.MissingPropertyException:No such property:length for class:java.lang.String]]; “ –

+0

尝试doc ['_ all']。values.size()而不是 – Arun

+0

首先,_all字段并不总是存在,因为它取决于索引模板 其次,通过这种方式, _all字段是一个特殊的全部字段,它将所有其他字段的值连接成一个大字符串,使用空格作为分隔符,[...]按照https://www.elastic.co/guide/ en/elasticsearch/reference/current/mapping-all-field.html,它在6.x中被弃用 – lucabelluccini

2

我已经使用这个代码(我已经启用了_source)

{ 
    "query" : {"match_all" : {}}, 
    "aggs":{ 
    "avg_length" : { "avg" : { "script" : "_source.toString().length()"}} 
    } 
} 

嗯,字符..。如果字符串是UTF-8,以获得字节:

{ 
    "query" : {"match_all" : {}}, 
    "aggs":{ 
    "avg_length" : { "avg" : { "script" : "_source.toString().getBytes(\"UTF-8\").length"}} 
    } 
}