标签:匹配 查看 客户 并且 获取 方式 表示 lte 多少
Sum求和,dsl参考如下:
{ "size": 0, "aggs": { "return_balance": { "sum": { "field": "balance" } } } }
返回balance之和,其中size=0 表示不需要返回参与查询的文档。
Min求最小值
{ "size": 0, "aggs": { "return_min_balance": { "min": { "field": "balance" } } } }
返回结果
Max求最大值
{ "size": 0, "aggs": { "return_max_balance": { "max": { "field": "balance" } } } }
返回结果:
AVG求平均值
{ "size": 0, "aggs": { "return_avg_balance": { "avg": { "field": "balance" } } } }
返回结果:
{ "size": 0, "aggs": { "return_cardinality": { "cardinality": { "field": "gender" } } } }
结果为:
查看官方文档时候,没看懂,下面是自己测试时的例子,按照性别(F,M)查看工资范围的百分比
{ "size": 0, "aggs": { "states": { "terms": { "field": "gender" }, "aggs": { "banlances": { "percentile_ranks": { "field": "balance", "values": [ 20000, 40000 ] } } } } }
结果:
查看balance的统计情况:
{ "size": 0, "aggs": { "balance_stats": { "stats": { "field": "balance" } } } }
返回结果:
{ "size": 0, "aggs": { "balance_stats": { "extended_stats": { "field": "balance" } } } }
结果:
更加复杂的查询,后续慢慢在实践中道来。
记录有多少F,多少M
{ "size": 0, "aggs": { "genders": { "terms": { "field": "gender" } } } }
返回结果如下:m记录507条,f记录493条
使用terms聚合,结果可能带有一定的偏差与错误性。
比如:
我们想要获取name字段中出现频率最高的前5个。
此时,客户端向ES发送聚合请求,主节点接收到请求后,会向每个独立的分片发送该请求。
分片独立的计算自己分片上的前5个name,然后返回。当所有的分片结果都返回后,在主节点进行结果的合并,再求出频率最高的前5个,返回给客户端。
这样就会造成一定的误差,比如最后返回的前5个中,有一个叫A的,有50个文档;B有49。 但是由于每个分片独立的保存信息,信息的分布也是不确定的。 有可能第一个分片中B的信息有2个,但是没有排到前5,所以没有在最后合并的结果中出现。 这就导致B的总数少计算了2,本来可能排到第一位,却排到了A的后面。
为了改善上面的问题,就可以使用size和shard_size参数。
通过这两个参数,如果我们想要返回前5个,size=5;shard_size可以设置大于5,这样每个分片返回的词条信息就会增多,相应的误差几率也会减小。
order指定了最后返回结果的排序方式,默认是按照doc_count排序。
{ "aggs" : { "genders" : { "terms" : { "field" : "gender", "order" : { "_count" : "asc" } } } } }
也可以按照字典方式排序:
{ "aggs" : { "genders" : { "terms" : { "field" : "gender", "order" : { "_term" : "asc" } } } } }
当然也可以通过order指定一个单值聚合,来排序。
{ "aggs" : { "genders" : { "terms" : { "field" : "gender", "order" : { "avg_balance" : "desc" } }, "aggs" : { "avg_balance" : { "avg" : { "field" : "balance" } } } } } }
同时也支持多值聚合,不过要指定使用的多值字段:
{ "aggs" : { "genders" : { "terms" : { "field" : "gender", "order" : { "balance_stats.avg" : "desc" } }, "aggs" : { "balance_stats" : { "stats" : { "field" : "balance" } } } } } }
返回结果:
聚合的字段可能存在一些频率很低的词条,如果这些词条数目比例很大,那么就会造成很多不必要的计算。
因此可以通过设置min_doc_count和shard_min_doc_count来规定最小的文档数目,只有满足这个参数要求的个数的词条才会被记录返回。
桶聚合也支持脚本的使用:
{ "aggs" : { "genders" : { "terms" : { "script" : "doc[‘gender‘].value" } } } }
以及外部脚本文件:
{ "aggs" : { "genders" : { "terms" : { "script" : { "file": "my_script", "params": { "field": "gender" } } } } } }
filter字段提供了过滤的功能,使用两种方式:include可以匹配出包含该值的文档,exclude则排除包含该值的文档。
例如:
{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags",
"include" : ".*sport.*",
"exclude" : "water_.*"
}
}
}
}
上面的例子中,最后的结果应该包含sport并且不包含water。
也支持数组的方式,定义包含与排除的信息:
{
"aggs" : {
"JapaneseCars" : {
"terms" : {
"field" : "make",
"include" : ["mazda", "honda"]
}
},
"ActiveCarManufacturers" : {
"terms" : {
"field" : "make",
"exclude" : ["rover", "jensen"]
}
}
}
}
通常情况,terms聚合都是仅针对于一个字段的聚合。因为该聚合是需要把词条放入一个哈希表中,如果多个字段就会造成n^2的内存消耗。
不过,对于多字段,ES也提供了下面两种方式:
对于子聚合的计算,有两种方式:
默认情况下ES会使用深度优先,不过可以手动设置成广度优先,比如:
{
"aggs" : {
"actors" : {
"terms" : {
"field" : "actors",
"size" : 10,
"collect_mode" : "breadth_first"
},
"aggs" : {
"costars" : {
"terms" : {
"field" : "actors",
"size" : 5
}
}
}
}
}
}
缺省值指定了缺省的字段的处理方式:
{
"aggs" : {
"tags" : {
"terms" : {
"field" : "tags",
"missing": "N/A"
}
}
}
}
标签:匹配 查看 客户 并且 获取 方式 表示 lte 多少
原文地址:http://www.cnblogs.com/duanxz/p/6528161.html