Elasticsearch 聚合查询及复合查询

集合查询
sum聚合
sum是一个求累加值的聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0, # 表示查询多少条文档,聚合只需就和结果,输出文档可以设置为0条
    "aggs": {
        "price_of_sum": { # 自行取名作为结果集
            "sum": {
                "field": "price"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
min聚合
min是一个求最小值的聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0,
    "aggs": {
        "price_of_min": {
            "min": {
                "field": "price"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
max聚合
max是一个求最大值聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0,
    "aggs": {
        "price_of_max": {
            "max": {
                "field": "price"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
avg聚合
avg是一个求平均值的聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0,
    "aggs": {
        "price_of_avg": {
            "avg": {
                "field": "price"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
cardinality聚合
cardinality是一个求基数的聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0,
    "aggs": {
        "price_of_cardi": {
            "cardinality": { # 其实相当于该字段互不相同的值有多少类,输出的是种类数
                "field": "price"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
terms聚合
terms是一个分组聚合,其作用与关系型数据库中相同。

GET /lib4/items/_search
{
    "size": 0,
    "aggs": {
        "price_of_by": {
            "terms": {
                "field": "price"
            }
        }
    }
}

# 对那些有唱歌兴趣的用户按年龄分组
GET /lib3/user/_search
{
    "query": {
        "match": {
            "interests": "changge"
        }
    },
    "size": 0,
    "aggs": {
        "agg_group_by": {
            "field": "age",
            "order": {
                "avg_of_age": "desc"
            }
        },
        "aggs": {
            "avg_of_age": {
                "age": {
                    "field": "age"
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
复合查询
使用bool查询
接受以下参数:
must:文档必须匹配设定条件才能被包含进来
must_not:文档必须不匹配设定条件才能被包含进来
should:如果满足语句中的任意语句,将增加_source,否则,无任何影响。主要用于修正每个文档的相关性得分
filter:必须匹配,但以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档

相关性得分是如何组合的?
每一个子查询都独自的计算文档的相关性得分,bool查询将对计算出的等分进行合并,然后返回一个代表整个布尔操作的等分。

下面的查询用于查找title字段匹配 how to make millions 并且不被标识为 spam的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 两者 都满足,那么它的排名将更高。

GET /lib3/user/_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "interests": "changge"
                }
            },
            "must_not": {
                "match": {
                    "interests": "lvyou"
                }
            },
            "should": [
                {
                    "match": {
                        "address": "bei jing"
                    }
                },
                {
                    "range": {
                        "birthday": {
                            "gte": "1996-01-01"
                        }
                    }
                }
            ]
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。如果不想因为文档的时间影响得分,可以用 filter 语句来重写前面的例子

# 可以在bool内嵌套filter过滤
GET /lib3/user/_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "interests": "changge"
                }
            },
            "must_not": {
                "match": {
                    "interests": "lvyou"
                }
            },
            "should": [
                {
                    "match": {
                        "address": "bei jing"
                    }
                }
            ],
            "filter": {
                "range": {
                    "birthday": {
                        "gte": "1996-01-01"
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
通过将 range 查询移动到 filter 语句中,我们将它转成不评分的查询,将不在影响文档的相关性排名,由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。

bool 查询本身也可以被用作不评分的查询,简单的将它放置到 filter 语句中并在内部构建布尔逻辑

# 在bool内嵌套fliter,在fliter下嵌套另一个bool作为过滤条件
GET /lib3/user/_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "interests": "changge"
                }
            },
            "must_not": {
                "match": {
                    "interests": "lvyou"
                }
            },
            "should": [
                {
                    "match": {
                        "address": "bei jing"
                    }
                }
            ],
            "filter": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "birthday": {
                                    "gte": "1990-01-01"
                                }
                            }
                        },
                        {
                            "range": {
                                "age": {
                                    "lte": 30
                                }
                            }
                        }
                    ],
                    "must_not": [
                        {
                            "term": {
                                "age": "29"
                            }
                        }
                    ]
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
constant_score查询
constant_score将一个不变的量评分应用于所有匹配的文档,被经常用于你只需要执行一个 fliter 而没有其他查询(例如:评分查询)的情况下。
请求结构如下:

{
    "constant_score": {
        "filter": {
            "term": {
                "category": "ebooks"
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
示例:

GET /lib4/items/_search
{
    "query": {
        "constant_score": {
            "filter": {
                "term": {
                    "interests": "changge"
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
term 查询被放置在constant_score中,转成不评分的 filter。这种方式可以用来取代只有 filter 语句的 bool 查询。
————————————————
版权声明:本文为CSDN博主「迷途码界」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zx711166/article/details/81906881

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值