ES的API
本篇是更加ES官网整理的有关查询的API
一、常用的查询
常用查询主要整理了:
- 全文搜索查询 ;
- Term条件查询 ;
- 复合查询 ;
1、全文搜索查询
1.1、应用场景
用于查询全文字段上进行全文搜索,例如email。
1.2、常用查询
1.2.1、match查询
语法略
返回略
1.2.2、multi_match 多字段匹配查询
语法:
{
"query": {
"multi_match": {
"query":2,
"fields":["log_id","user_id"]
}
}
}
返回:在log_id 或者user_id 等于2的数据
2、Term条件查询
2.1应用场景
对像数字、日期等字段进行条件查询。例如查询 时间范围、数字查询、模糊查询等。不能再full text上使用。
2.2、常用查询
2.2.1、range范围查询
语法:
{
"query": {
"range": {
"create_time": {
"gte":"2020-08-30 11:59:59",
"format":"yyyy-MM-dd hh:mm:ss"
}
}
}
}
返回:、
返回create_time大于等于2020-08-30 11:59:59的所有数据
2.2.2、exists非空值查询
语法:
{
"query": {
"exists": {
"field":"math"
}
}
}
返回:查询所有带有math的字段的数据。
2.2.3、prefix前缀查询
语法:
{
"query": {
"prefix": {
"user_name":"李"
}
}
}
返回:返回所有用户名包含 ‘李’的数据
2.2.4、wildcard通配符查询
语法:
{"query":{
"wildcard" :{
"user_name":{
"value":"李*仁"
}
}
}}
说明:* 表示匹配多个字符,?表示匹配一个字符。
2.2.5、fuzzy模糊查询
语法:
{"query":{
"fuzzy" :{
"user_name":{
"value":"五"
}
}
}}
结果:查询姓名中所有带‘五’的数据
2.2.6、term条件查询
语法:
{
"query": {
"term" : { "english" : 85 }
}
}
如果是中文:
{
"query": {
"term" : { "user_name.keyword" : "张三" }
}
}
返回:
准备查询英语成绩为 85的学生
3、复合查询
3.1、应用场景
将其他复合查询或者叶子查询综合起来。must、must not、 should 、filter等进行筛选
3.2、常用查询
3.2.1、bool查询
语法:
{
"query": {
"bool": {
"must":{
"range":{"id":{"gte":11860}}
},
"filter":{
"term":{"id":11861}
}
}
}
}
返回:查询条件必须是id大于等于11860的,并且过滤出id为11861的数据。
二、聚合分析
1、度量级聚合
2.1应用场景
对数据的某个字段进行计算,得到一个具体的值。例如对学生的数学成绩做,最大、最小、平均值、前几名等的统计。属于单指标的聚合查询
2.2常用查询
2.2.1、ave/max/min/sum aggregation 平均值/最大、小/求和聚合
语法:
{
"aggs":{
"max_english":{
"max":{
"field":"english"
}
}
}
}
返回:
返回的max_english的值即为英语成绩的最高分。
2.2.2、cardinality aggregation基数聚合
语法:
{
"aggs":{
"user_count":{
"cardinality":{
"field":"user_id"
}
}
}
}
返回:去重后的userid的个数。
2.2.3、Status/Extend Status aggregation 扩展状态聚合
Status语法:
{
"aggs":{
"english_count":{
"stats":{
"field":"english"
}
}
}
}
返回:
英语成绩的最大、最小、平均、数量信息
"aggregations": {
"english_count": {
"count": 8,
"min": 78.0,
"max": 98.0,
"avg": 91.0,
"sum": 728.0
}
}
Extended status语法
{
"aggs":{
"extended_info":{
"extended_stats":{
"field":"english"
}
}
}
}
返回:除了state包含信息之外的其他统计信息
"aggregations": {
"extended_info": {
"count": 8,
"min": 78.0,
"max": 98.0,
"avg": 91.0,
"sum": 728.0,
"sum_of_squares": 66694.0,
"variance": 55.75,
"variance_population": 55.75,
"variance_sampling": 63.714285714285715,
"std_deviation": 7.466592261534039,
"std_deviation_population": 7.466592261534039,
"std_deviation_sampling": 7.982122882685139,
"std_deviation_bounds": {
"upper": 105.93318452306808,
"lower": 76.06681547693192,
"upper_population": 105.93318452306808,
"lower_population": 76.06681547693192,
"upper_sampling": 106.96424576537028,
"lower_sampling": 75.03575423462972
}
}
}
2.2.4、Percentiles Aggregation 百分比聚合
语法:
{
"aggs":{
"percent_info":{
"percentiles":{
"field":"english"
}
}
}
}
结果:
返回计算出的百分之比之间的值
指定百分之区间:
{
"aggs":{
"percent_info":{
"percentiles":{
"field":"english",
"percents" : [95, 99, 99.9]
}
}
}
}
结果:
"aggregations": {
"percent_info": {
"values": {
"95.0": 98.0,
"99.0": 98.0,
"99.9": 98.0
}
}
}
2、桶聚合
2.1、应用场景
个人理解:将查询的每条结果,然后根据我们设定的区间做成一个个桶,然后再将每个结果放入到相应的桶内
2.2、常用查询
2.2.1、Global Aggregation 全局聚合
语法:
{
"query":{"match":{"user_id":"1"}}, //查询userid=1的信息数据
"aggs":{
"english_avg":{"avg":{"field":"english"}},//返回userId=1的平均成绩
"all_user":{ //返回所有人的平均成绩
"global":{},
"aggs":{
"all_avg_lenglish":{"avg":{"field":"english"}}//返回所有人的平均成 绩
}
}
}
}
返回:
"aggregations": {
"english_avg": {
"value": 81.5
},
"all_user": {
"doc_count": 8,
"all_avg_lenglish": {
"value": 91.0
}
}
}
2.2.2、Range Aggregation 范围聚合
语法:
{"aggs":{
"eng_range":{
"range":{
"field":"english",
"ranges":[
{"to":60},
{"from":60,"to":80},
{"from":80}
]
}
}
}}
返回:
"buckets": [{
"key": "*-60.0",
"to": 60.0,
"doc_count": 0
}]
对范围值在聚合:
语法:{
"aggs":{
"eng_range":{
"range":{
"field":"english",
"ranges":[
{"to":60},
{"from":60,"to":80},
{"from":80}
]
},
"aggs":{ //对已经获取的range内的值在急性status 聚合
"eng_status":{
"stats":{
"field":"english"
}
}
}
}
}}
返回:
"buckets": [
{
"key": "*-60.0",
"to": 60.0,
"doc_count": 0,
"eng_status": {
"count": 0,
"min": null,
"max": null,
"avg": null,
"sum": 0.0
}
}]
2.2.3、Filter Aggregation 过滤聚合
语法:
{"aggs":{
"user_filter":{
"filter":{"term":{"user_id":1}}}}}
结果:
"aggregations": { //去重后的数据个数
"user_filter": {
"doc_count": 2
}
}
Filter嵌套聚合:
语法:
{"aggs":{
"user_filter":{
"filter":{"term":{"user_id":1}},
"aggs":{"avg_eng":{"avg":{"field":"english"}}}
}
}}
结果:
"aggregations": {
"user_filter": {
"doc_count": 2,
"avg_eng": {
"value": 81.5
}
}
}
2.2.4、Terms Aggregation terms聚合
语法:
{"aggs":{
"user_term":{
"terms":{
"field":"user_id", //根据userId统计 每个userId的个数,类似于group by + count
"order":{"_count":"asc"}
}
}
}}
结果
"buckets": [
{
"key": 4,
"doc_count": 1
}]
2.2.4、Histogram Aggregation 直方图聚合
语法:
{"aggs":{
"eng" :{
"histogram":{
"field":"english",
"interval":10
} }}}
返回:
"buckets": [
{
"key": 70.0,
"doc_count": 1
},
{
"key": 80.0,
"doc_count": 3
},
{
"key": 90.0,
"doc_count": 4
}
]
3、管道聚合
3.1、应用场景
在桶聚合后的数据进行计算。比如,平均值聚合后得到buckets,然后再对将桶看作一个对象,对桶数据做运算。
3.2、常用查询
3.2.1、Avg/max/min/sum Buckets Aggregation 平均值桶聚合
语法:
{"aggs":{
"eng" :{
"histogram":{
"field":"english",
"interval":10
},
"aggs":{
"eng_sum" :{
"sum":{
"field":"english"
}
}
}
},
"avg_his_score" :{
"avg_bucket":{
"buckets_path":"eng>eng_sum"
}
}
}}
结果:
"aggregations": {
"eng": {
"buckets": [
{
"key": 70.0,
"doc_count": 1,
"eng_sum": {
"value": 78.0
}
},
{
"key": 80.0,
"doc_count": 3,
"eng_sum": {
"value": 258.0
}
},
{
"key": 90.0,
"doc_count": 4,
"eng_sum": {
"value": 392.0
}
}
]
},
"avg_his_score": {
"value": 242.66666666666666
}
}
分析:
"avg_his_score": {
"value": 242.66666666666666
}
为三个桶value值的和/3
3.2.2、Status /Extend Status Buckets Aggregation
将桶作为对象,对桶数据做状态分析。
{"aggs":{
"eng" :{
"histogram":{
"field":"english",
"interval":10
},
"aggs":{
"eng_sum" :{
"sum":{
"field":"english"
}
}
}
},
"stats_his_score" :{
"stats_bucket":{
"buckets_path":"eng>eng_sum"
}
}
}}
结果:只看stats_his_socre部分,对桶做了数值状态分析
"stats_his_score": {
"count": 3,
"min": 78.0,
"max": 392.0,
"avg": 242.66666666666666,
"sum": 728.0
}