1. 复合查询——bool
ES 5.0版本后,filtered参数被bool代替。
bool有4类查询关系:
must:所有分句都必须匹配,与 AND 相同;
filter:所有分句都必须匹配,但忽略查询得分;
should:至少有一个分句匹配,与 OR 相同;
must_not:所有分句都必须不匹配,与 NOT 相同。
# 查询alarmtitle中包含"攻击"并且equipmenttype包含"PSBC"的数据
{
"query":{
"bool": {
"must": [
{"match": {
"alarmtitle": "攻击"
}},
{"match": {
"equipmenttype": "PSBC"
}}
]
}
}
}
2. 全文查询——match
模糊查询。用于查询可分析的字段。multi_match的fields中填写的字段需可分析(analyzed)。
# match:查询full_value包含"Quick Foxes!"关键字的数据
{
"query":{
"match":{
"full_value": "Quick Foxes!"
}
}
}
# multi_match:查询name或addr包含"深圳"关键字的数据
{
"query":{
"multi_match":{
"query":"深圳",
"fields":["name","addr"]
}
}
}
3. 全词查询——term
精确查询。不能用于可分析的字段,主要用于查询精确值,如关键字、数字和日期等。
# term:查询exact_value为"Quick Foxes!"的所有数据
{
"query":{
"term":{
"exact_value": "Quick Foxes!"
}
}
}
# terms:查询full_value包含"quick"或"foxes"的所有数据
{
"query":{
"terms":{
"full_value":[
"quick","foxes"
]
}
}
}
4.时间过滤
#gte:>=, gt:>, lt:<, lte:<=
{
"query":{
"range": {
"eventtime": {
"gte": "2018-05-15T21:12:42.000Z",
"lte": "2018-05-15T21:12:43.000Z"
}
}
}
}
5.排序
#asc:正序,desc:倒序
{
"sort":{
"eventtime": {
"order": "desc"
}
}
}
6.切片式查询
ES可通过from、size进行切片式查询。未指定from、size时默认返回前10条数据,即from=0,size=10。
{
"from":2, # 从第二条数据开始
"size":4, # 获取4条数据
"query":{
"match_all":{}
}
}
ES查询最大返回结果数为10000,即"index.max_result_window": "10000",请求10000条之后的数据会报错。可通过restful接口来put一个模板修改index.max_result_window值。
7.聚合——aggs
1)分类
使用terms进行分类统计,相当于MySQL中的Group by。
{
"query":{
"match": {
"equipmenttype": "PSBC"
}
},
"aggs" : {
"alarm" : { #自定义名称
"terms" : {
"field" : "alarmseverity"
}
}
}
}
返回样例:
"aggregations": {
"cpuutils": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 2,
"doc_count": 7
},
{
"key": 1,
"doc_count": 2
},
{
"key": 4,
"doc_count": 2
},
{
"key": 3,
"doc_count": 1
}
]
}
}
其中buckets默认返回10个,可在terms里添加size属性进行调整。
2)基础计算
使用avg计算平均值。字段需为int、float、double等可计算类型。
{
"query":{
"match_all":{}
},
"aggs":{
"avg_age":{
"avg":{
"field":"age"
}
}
}
}
还可计算sum、max、min、count、stats(包含以上所有)。
3)脚本计算
使用scripted_metric编写脚本。
{
"query":{
"match_all":{}
},
"aggs":{
"avg_disk" : {
"scripted_metric" : {
"init_script" : "params._agg['subtract'] = []",
"map_script" : "params._agg.subtract.add((doc.diskarrayreadbandwidth.value - doc.diskarrayavailablecapacity.value)/doc.diskarrayreadbandwidth.value)",
"combine_script" : "double total=0; int num_of_subtract=0; for (i in params._agg.subtract) { total += i; num_of_subtract += 1 } return [total, num_of_subtract]",
"reduce_script" : "double total=0; int num_of_subtract=0; for (item in params._aggs) { total += item[0]; num_of_subtract += item[1]} return total / num_of_subtract"
}
}
}
}
(1)init_script:初始化时运行,一般是设置初始的全局变量;
(2)map_script:会对每个文档做循环,把每个计算好的收入用add方法加到每个分片的params._agg.subtract里面;
(3)combine_script:我们知道ES是分布式的,数据有多个分片,当map_script完成后,它用来对每个分片的那部分结果做求和和计数的预处理;
(4)reduce_script:如果你了解MapReduce,我想对2和4步就能更好的理解了,这一步能通过params._aggs把每个分片的预处理结果拿来再做处理,最后求得平均值。
4)峰值计算
使用top_hits进行筛选。多列分类后,按"createat"倒序排序,取前一个,列出"_source"中包含的字段。
{
"query":{
"match_all":{}
},
"aggs" : {
"term_1": {
"terms": {
"field": "vimid.keyword",
"size": 100000000
},
"aggs": {
"term_2":{
"terms": {
"field": "vmid.keyword",
"size": 100000000
},
"aggs":{
"top_sales_hits": {
"top_hits": {
"sort": [
{
"createat": {
"order": "desc"
}
}
],
"_source": {
"includes": [ "vimid", "vmid", "createat", "vcpuutil" ]
},
"size" : 1
}
}
}
}
}
}
}
}
参考文档:
Python-ElasticSearch搜索
ES官方文档:Query DSL