自定义聚合
- 关闭标准聚合
- 数值平均分布区间
- max
- min
- sum
- avg
- stats
- exstats
- value_count
- percentiles
- percentile_ranks
- cardinality
- missing
- terms
- range
- date_range
- histogram
- date_histogram
- geo_distance
- cats
1. 关闭标准聚合
为了减少应用聚合的请求参数,标准聚合默认是开启的,对应的参数为"ignore_default_agg",该参数的值为"true"、"false","true"表示关闭标准聚合,"false" 反之。
2. 数值平均分布区间
数值平均分布区间针对数值字段,将数值字段统计划分为不同的区间,每个区间的文档数目基本相同。主要应用场景是商品搜索的价格区间,将符合条件的商品价格划分成指定数目的区间,每个区间的商品数目基本相同。在使用此功能前,商品的价格区间只能通过固定配置的方式,这样区间要么没有商品要么商品分布不均,没有较好的区分度,对用户的进一步筛选并不友好。 区间为左闭右开,实现的算法见:
聚合条件格式
ex_section_属性名=section(size:6,optimize:false)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 需要划分区间的字段名称,字段必须为数值类型(整数、浮点数均可) |
size | int | 选填 | 划分的区间数目,默认值为6 |
optimize | bool | 选填 | 表示是否对区间进行平滑处理,可不填,默认为false;当前该属性不可用 |
如果都使用默认参数该聚合条件可简写为:ex_section_属性名
返回结果
- 返回结果的"属性名_section"字段存放划分好的区间。
- 区间为左闭右开。"from"字段表示区间的起始值,没有表示为0;"to"字段表示区间的终止值,没有表示最大;"doc_count"表示该区间文档数。
下面的例子表示对商品的销售价格进行均分区间统计:
{
"salePrice_section": [
{
"to": 10.0,
"doc_count": 41
},
{
"to": 40.0,
"from": 10.0,
"doc_count": 28
},
{
"to": 60.0,
"from": 40.0,
"doc_count": 22
},
{
"to": 90.0,
"from": 60.0,
"doc_count": 29
},
{
"to": 140.0,
"from": 90.0,
"doc_count": 38
},
{
"from": 140.0,
"doc_count": 46
}
]
}
3. max
max统计数值字段的最大值,返回单个值。max统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=max(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的最大值
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=max()&
{
"ex_agg_salePrice.max": {
"value": 195500.0
}
}
{
"ex_agg_salePrice.max": {
"value": 5555.0
}
}
4. min
min统计数值字段的最小值,返回单个值。min统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=min(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的最小值
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=min()&
{
"ex_agg_salePrice.min": {
"value": 0.01
}
}
{
"ex_agg_salePrice.min": {
"value": 0.01
}
}
5. sum
sum统计数值字段的和,返回单个值。sum统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=sum(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的总和
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=sum()&
{
"ex_agg_salePrice.sum": {
"value": 1264913.6499999994
}
}
{
"ex_agg_salePrice.sum": {
"value": 1264913.6499999994
}
}
6. avg
avg统计数值字段的平均值,返回单个值。avg统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=avg(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的平均值
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=avg()&
{
"ex_agg_salePrice.avg": {
"value": 144.87614820753646
}
}
{
"ex_agg_salePrice.avg": {
"value": 144.87614820753646
}
}
7. stats
stats统计数值字段信息,返回多个指标,分别为:min, max, sum, count 和 avg。stats统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=stats(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格信息
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=stats()&
{
"ex_agg_salePrice.stats": {
"count": 8731,
"max": 195500.0,
"sum": 1264913.6499999994,
"avg": 144.8761482075363,
"min": 0.01
}
}
{
"ex_agg_salePrice.stats": {
"count": 8731,
"max": 195500.0,
"sum": 1264913.6499999994,
"avg": 144.8761482075363,
"min": 0.01
}
}
8. exstats
exstats 统计数值字段的扩展信息,比stats增加了sum_of_squares, variance, std_deviation and std_deviation_bounds指标。统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=exstats(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的扩展信息
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=exstats()&
{
"ex_agg_salePrice.exstats": {
"count": 8731,
"min": 0.01,
"sum_of_squares": 71954295591.20363,
"max": 195500.0,
"sum": 1264913.650000001,
"std_deviation": 2867.098575301637,
"std_deviation_bounds": {
"upper": 5879.07329881081,
"lower": -5589.321002395738
},
"variance": 8220254.240496677,
"avg": 144.8761482075365
}
}
{
"ex_agg_salePrice.exstats": {
"count": 8731,
"min": 0.01,
"sum_of_squares": 71954295591.20363,
"max": 195500.0,
"sum": 1264913.650000001,
"std_deviation": 2867.098575301637,
"std_deviation_bounds": {
"upper": 5879.07329881081,
"lower": -5589.321002395738
},
"variance": 8220254.240496677,
"avg": 144.8761482075365
}
}
9. value_count
value_count统计数值字段的值的个数,返回单个值。value_count统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=value_count(script:doc.price.value*2)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
返回结果
- 统计商品销售价格的值个数
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=value_count()&
{
"ex_agg_salePrice.value_count": {
"value": 8731
}
}
{{
"ex_agg_salePrice.value_count": {
"value": 8731
}
}
10. percentiles
percentiles统计数值字段的百分比分布值。percentiles统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。对价格进行percentiles统计,就可以知道10%、30%、80%...的商品价格的范围。
查询条件格式
ex_agg_属性名=percentiles(script:doc.price.value*2,percents:10,20.5,60)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
percents | string | 选填 | 查询的百分比范围,默认值为:1,5,25,50,75,95,99 |
返回结果
- 统计商品销售价格的百分比分布值
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_salePrice=percentiles()&
{
"ex_agg_salePrice.percentiles": {
"values": {
"5.0": 1.0,
"25.0": 3.7956109381486094,
"1.0": 0.7,
"95.0": 281.91499999999996,
"75.0": 36.98249482401657,
"99.0": 1647.8333333333346,
"50.0": 9.945782541322313
}
}
}
{
"ex_agg_salePrice.percentiles": {
"values": {
"5.0": 1.0,
"25.0": 3.7956109381486094,
"1.0": 0.7,
"95.0": 281.91499999999996,
"75.0": 36.98249482401657,
"99.0": 1647.8333333333346,
"50.0": 9.945782541322313
}
}
}
11. percentile_ranks
percentile_ranks统计和percentiles统计相反,统计数值字段值的百分比分布。percentile_ranks统计字段可以是文档中的数值字段,也可以是由脚本生成的动态字段。对价格进行percentile_ranks统计,就可以知道价格5、20、40...的百分比。
查询条件格式
ex_agg_属性名=percentile_ranks(script:doc.price.value*2,values:10,20.5,60)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
script | string | 选填 | 动态脚本,如果使用脚本动态生成字段的话就使用该参数 |
values | string | 必填 | 查询的值, |
返回结果
- 统计商品销售价格的百分比分布
{
"ex_agg_salePrice.percentile_ranks": {
"values": {
"60.5": 83.49704574137265,
"30.0": 71.18680342046017,
"1300.0": 98.73843222982032
}
}
}
{
"ex_agg_salePrice.percentile_ranks": {
"values": {
"60.5": 83.49704574137265,
"30.0": 71.18680342046017,
"1300.0": 98.73843222982032
}
}
}
12. cardinality
cardinality统计字段的不同值的个数,类似于数据库的count(distinct a),返回单个值。统计字段可以是文档中的字段,也可以是由脚本生成的动态字段。
查询条件格式
ex_agg_属性名=cardinality(precision_threshold:100)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
precision_threshold | int | 选填 | 精度 |
返回结果
- 统计SKU属于的SPU数目
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_spuId=cardinality()&
{
"ex_agg_spuId.cardinality": {
"value": 8765
}
}
13. missing
missing统计文档中没有该字段或者字段值为null或者空集合的情况,返回单个值。
查询条件格式
ex_agg_属性名=missing()
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
返回结果
- 统计SKU中没有设置产品线值的商品数目
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_productLine=missing()&
{
"ex_agg_productLine.missing": {
"doc_count": 714
}
}
14. terms
terms统计文档中字段的词条数目情况,返回的词条按照文档数目从高到低排列。我们可以通过terms统计商品中的品牌以及各个品牌下面的商品数目。
查询条件格式
ex_agg_属性名=terms(size:10;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
size | int | 选填 | 返回的词条数目,默认值为10,0表示不限制数目,返回所有的term |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
返回结果
key表示词条名称,doc_count表示词条下的文档数
- 统计SKU中前10个商品数目最多的品牌
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_brand=terms(size:10)&
"ex_agg_brand.terms": {
"buckets": [
{
"key": "",
"doc_count": 2323
},
{
"key": "得力(deli)",
"doc_count": 1383
},
{
"key": "Deli/得力",
"doc_count": 824
},
{
"key": "米乐熊",
"doc_count": 206
},
{
"key": "齐心",
"doc_count": 135
},
{
"key": "得力(Deli)",
"doc_count": 116
},
{
"key": "贝亲",
"doc_count": 106
},
{
"key": "格力高",
"doc_count": 100
},
{
"key": "乐事",
"doc_count": 90
},
{
"key": "恒顺",
"doc_count": 84
}
],
"sum_other_doc_count": 3364,
"doc_count_error_upper_bound": 39
}
}
15. range
range统计文档中数值字段的范围情况。我们可以通过range统计文档中数值字段值的分布范围。
查询条件格式
ex_agg_属性名=range(ranges:-200,200-400,400-1000,1000-;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
ranges | string | 必填 | 要统计的范围,左闭右开 |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
返回结果
from表示区间的开始值,to表示区间的结束值,doc_count表示该区间的文档数
- 统计SKU价格区间的商品数目
{
"ex_agg_salePrice.range": {
"buckets": [
{
"from": 0.0,
"from_as_string": "0.0",
"to_as_string": "50.0",
"doc_count": 6940,
"to": 50.0,
"key": "0.0-50.0"
},
{
"from": 50.0,
"from_as_string": "50.0",
"to_as_string": "200.0",
"doc_count": 1258,
"to": 200.0,
"key": "50.0-200.0"
},
{
"from_as_string": "200.0",
"from": 200.0,
"key": "200.0-*",
"doc_count": 533
}
]
}
}
16. date_range
date_range统计文档中日期字段的范围情况。我们可以通过date_range统计文档中日期字段值的分布范围。
查询条件格式
ex_agg_属性名=date_range(ranges:str:now-10M/M--str:now+10M/M,now-10M/M--,--now-10M/M;keyed:true;script:doc.price.value*2;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
ranges | string | 必填 | 要统计的范围,左闭右开 |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
返回结果
from表示区间的开始值,to表示区间的结束值,doc_count表示该区间的文档数
- 统计SKU价格区间的商品数目
{
"ex_agg_salePrice.date_range": {
"buckets": [
{
"to": 1.3437792E+12,
"to_as_string": "08-2012",
"doc_count": 7
},
{
"from": 1.3437792E+12,
"from_as_string": "08-2012",
"doc_count": 2
}
]
}
}
17. histogram
histogram统计文档中数值字段的范围情况,和range统计不同的是histogram只需要指定一个区间长度即可。
查询条件格式
ex_agg_属性名=histogram(interval:100;keyed:true;extended_bounds:num:45-num:666;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
interval | int | 必填 | 区间长度 |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
返回结果
key表示区间的开始值,doc_count表示该区间的文档数
- 统计SKU价格区间间隔1000的商品数目
{
"ex_agg_salePrice.histogram": {
"buckets": [
{
"key": 0,
"doc_count": 8583
},
{
"key": 1000,
"doc_count": 84
},
{
"key": 2000,
"doc_count": 23
},
{
"key": 3000,
"doc_count": 14
},
{
"key": 4000,
"doc_count": 6
},
{
"key": 5000,
"doc_count": 6
},
{
"key": 6000,
"doc_count": 4
},
{
"key": 10000,
"doc_count": 1
},
{
"key": 11000,
"doc_count": 1
},
{
"key": 13000,
"doc_count": 1
},
{
"key": 20000,
"doc_count": 2
},
{
"key": 24000,
"doc_count": 2
},
{
"key": 25000,
"doc_count": 1
},
{
"key": 88000,
"doc_count": 1
},
{
"key": 147000,
"doc_count": 1
},
{
"key": 195000,
"doc_count": 1
}
]
}
}
18. date_histogram
date_histogram统计文档中时间字段的范围情况,和date_range统计不同的是date_histogram只需要指定一个区间长度即可。
查询条件格式
ex_agg_属性名=date_histogram(interval:1.5h;keyed:true;format:yyyy-MM-dd;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
interval | string | 必填 | 区间长度,需要带上时间单位,y(年),M(月),w(星期),d(天),h(小时),m(分钟),s(秒) |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
format | string | 选填 | 输出的日期格式 |
返回结果
key表示区间的开始值,doc_count表示该区间的文档数
- 统计SKU价格区间间隔1000的商品数目
{
"ex_agg_salePrice.date_histogram": {
"buckets": [
{
"key_as_string": "2013-02-02",
"key": 1328140800000,
"doc_count": 1
},
{
"key_as_string": "2013-03-02",
"key": 1330646400000,
"doc_count": 2
},
...
]
}
}
19. geo_distance
geo_distance统计文档中地理位置字段距离某个坐标的距离的范围情况。
查询条件格式
ex_agg_属性名=geo_distance(ranges:num:45-num:666,num:99-,-num:200;origin:52.3760, 4.894;unit:km;distance_type:sloppy_arc;min_doc_count:10)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
origin | string | 必填 | 坐标点位置,经纬度的格式 |
ranges | string | 必填 | 要统计的范围,左闭右开 |
unit | string | 选填 | 距离单位,默认值m,可选值,单位有km、m、cm、mm、mi、yd、ft等 |
min_doc_count | int | 选填 | 统计的最小文档数,默认值:1 |
返回结果
from表示区间的开始值,to表示区间的结束值,doc_count表示该区间的文档数
{
"ex_agg_salePrice.geo_distance": {
"buckets": [
{
"key": "*-100.0",
"from": 0,
"to": 100.0,
"doc_count": 3
},
{
"key": "100.0-300.0",
"from": 100.0,
"to": 300.0,
"doc_count": 1
},
{
"key": "300.0-*",
"from": 300.0,
"doc_count": 7
}
]
}
}
20. cats
cats统计文档中的类目字段。比如我们可以通过cats实时统计出商品所有的类目结构树,可以获得类似于B2C商城首页的类目树结构。
查询条件格式
ex_agg_属性名=cats(depth:3)
查询参数
参数名 | 数据类型 | 可需 | 描述 |
---|---|---|---|
属性名 | string | 必填 | 查询的字段 |
depth | int | 选填 | 要统计的类目深度,depth从0开始,即一级目录为0,可不填,默认为2,默认值在系统参数中配置 |
返回结果
统计商品的二级类目:
http://0.0.0.0:8009/aggregations/A967550?ignore_default_agg=true&ex_agg_cats=cats(depth:1)
{
"ex_agg_cats.cats": [
{
"childs": [
{
"key": "办公文仪",
"doc_count": 3065
},
{
"key": "家居生活",
"doc_count": 1163
},
{
"key": "休闲食品",
"doc_count": 1043
},
{
"key": "酒水饮料",
"doc_count": 690
},
{
"key": "主食调味",
"doc_count": 677
},
{
"key": "母婴用品",
"doc_count": 640
},
{
"key": "设备耗材",
"doc_count": 551
},
{
"key": "品牌馆",
"doc_count": 376
},
{
"key": "运动户外",
"doc_count": 29
},
{
"key": "玩具乐器",
"doc_count": 11
},
{
"key": "6月特惠活动商品",
"doc_count": 7
},
{
"key": "虚拟卡券",
"doc_count": 7
}
],
"key": "b2b",
"doc_count": 7877
},
{
"childs": [
{
"key": "办公文仪",
"doc_count": 2942
},
{
"key": "家居生活",
"doc_count": 1091
},
{
"key": "休闲食品",
"doc_count": 959
},
{
"key": "酒水饮料",
"doc_count": 661
},
{
"key": "主食调味",
"doc_count": 644
},
{
"key": "设备耗材",
"doc_count": 538
},
{
"key": "母婴用品",
"doc_count": 478
},
{
"key": "运动户外",
"doc_count": 27
},
{
"key": "玩具乐器",
"doc_count": 9
},
{
"key": "虚拟卡券",
"doc_count": 7
},
{
"key": "6月特惠组合",
"doc_count": 1
}
],
"key": "b2c",
"doc_count": 7354
},
{
"childs": [
{
"key": "美丽的东西",
"doc_count": 1
}
],
"key": "p2c",
"doc_count": 1
}
]
}