Elasticsearch查询

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 查询和过滤的区别 ES提供基于JSON的完整DSL来定义查询,查询DSL包括两种子句:叶查询子句:在特定的字段上查...
    写Bug的张小天阅读 3,036评论 0 2
  • 使用KIBANA查询ES中的数据 在搜索时,一定要选择合理的时间范围,这个时间范围是基于创建索引模式时选择的时间字...
    Evelynzzz阅读 5,922评论 0 1
  • Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist...
    朱小虎XiaohuZhu阅读 1,274评论 0 0
  • 打开许久没看过的豆瓣提醒,一个活动——如果世界上有另一个我你准备和她说些什么。想说的话未出口,活动已经过期了...
    糖糖风阅读 416评论 0 1
  • hjkhkjkjhk67676fafafafsafafasffasdafds
    wv阅读 134评论 0 1