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

你可能感兴趣的:(Elasticsearch查询)