【ES HTTP-高级查询 02】
一、高级查询
Elasticsearch提供了基于JSON完整的DSL来定义查询
# 构造数据-供后续各种复杂的查询做准备
# POST /student/_doc/1001 { "name": "zhangsan", "nickname": "zhangsan", "sex": "男", "age": 30 } # POST /student/_doc/1002 { "name": "lisi", "nickname": "lisi", "sex": "男", "age": 20 } # POST /student/_doc/1003 { "name": "wangwu", "nickname": "wangwu", "sex": "女", "age": 40 } # POST /student/_doc/1004 { "name": "zhangsan1", "nickname": "zhangsan1", "sex": "女", "age": 50 } # POST /student/_doc/1005 { "name": "zhangsan2", "nickname": "zhangsan2", "sex": "女", "age": 30 }
1、查询所有文档-match_all
发送GET请求:{{es_url}}/student/_search
//请求体信息 { "query":{ "match_all":{} } } /* query:代表一个查询对象,里面可以有不同的查询属性 match_all:查询类型, 例如:match_all:代表查询所有 match:根据一个字段查询 multi_match:根据多个字段查询,参与查询的字段越多,性能越差 term:精准查询,输入值必须与此条内容保持一致 range:用于查询范围:价格日期等 */
备注:查询所有数据可以有请求体信息也可以没有直接发送接口
DSL查询语法 可参考https://blog.csdn.net/K_zibeng/article/details/126970214
2、匹配查询-match(即:全文检索查询)-->利用分词器对用户输入内容分词,在倒排索引库中进行匹配
match根据一个字段查询,会把查询条件进行分词,然后进行查询,多个分词之间是or的关系
发送GET请求:{{es_url}}/student/_search
//请求体 { "query":{ "match":{ "name":"zhangsan" } } }
3、字段匹配查询-multi_match
multi_match与match类似,不同的是它可以多个字段查询
发送GET请求:{{es_url}}/student/_search
//请求体 { "query":{ "multi_match":{ "query":"lisi", //查询对象 "fields":["name","nickname"] //具体查询的字段 } } }
4、关键字精确查询 -term
term查询,精确的关键词匹配查询,不对查询条件进行分词
发送GET请求:{{es_url}}/student/_search
//请求体 { "query":{ "term":{ "name":{ //查询字段 "value":"zhangsan" //查询的值 } } } }
5、多关键字精确查询-terms
terms查询和term查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值的任何一个值,那么这个文档满足条件,类似MySQL种的in
发送GET请求:{{es_url}}/student/_search
6、指定查询字段-_source
默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。如果我们只想获取其中的部分字段,我们可以添加_source的过滤
发送GET请求:{{es_url}}/student/_search
//请求体 { "_source":["name","nickname"], "query":{ "terms":{ "name":["zhangsan","wangwu"] } } }
7、过滤字段-_source-includes/excludes
可以通过:includes:来指定想要显示的字段/excludes:来指定不想要显示的字段
发送GET请求:{{es_url}}/student/_search
//includes的请求体 { "_source":{ "includes":["name","nickname"] //显示name、nickname }, "query":{ "terms":{ "name":["zhangsan","wangwu"] } } } //excludes的请求体 { "_source":{ "excludes":["name","nickname"] //不显示name、nickname }, "query":{ "terms":{ "name":["zhangsan","wangwu"] } } }
8、组合查询-bool-must/must_not/should
bool把各种其他查询通过must(必须)、must_not(必须不)、should(应该)的方式进行组合
发送GET请求:{{es_url}}/student/_search
//请求体: { "query":{ "bool":{ "must":[ { "match":{ "name":"zhangsan" } } ], "must_not":[ { "match":{ "age":40 } } ], "should":[ { "match":{ "sex":"男" } } ] } } }
9、范围查询-range
range查询找出那些落在指定区间内的数字或者时间。range查询允许以下字符
发送GET请求:{{es_url}}/student/_search
//请求体-查询年龄大于等于30小于等于45的数据 { "query":{ "range":{ "age":{ "gte":30, //大于等于30 "lte":45 //小于等于45 } } } }
10、模糊查询-fuzzy
返回包含与搜索字词相似的文档,为了找到相似的术语,fuzzy查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配
通过fuzziness修改编辑距离。一般使用默认值AUTO,根据术语的长度生成编辑距离。
编辑距离是将一个术语转换为另外一个术语所需的一个字符更改的次数。这些更改包括:
- 更改字符(box -> fox)
- 删除字符(black -> lack)
- 插入字符(sic -> sick)
- 转置两个相邻字符(act -> cat)
发送GET请求:{{es_url}}/student/_search
//请求体信息 { "query": { "fuzzy": { "name": { "value": "zhangsan", "fuzziness":2 //不编写的话默认为auto } } } }
11、单字段排序-sort
sort可以让我们按照不同的字段进行排序,并且通过order指定排序的方式。desc降序,asc升序
发送GET请求:{{es_url}}/student/_search
//请求体信息 { "query":{ "fuzzy":{ "name":{ "value":"hangsan" } } }, "sort":[ { "age":{ "order":"desc" } } ] }
12、多字段排序-_score
假定我们想要结合使用age和——score进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序
发送GET请求:{{es_url}}/student/_search
//请求体信息 { "query":{ "match_all":{} }, "sort":[ { "age":{ //先按年龄排序 "order":"desc" } }, { "_score":{ //在按相关性得分排序 "order":"desc" } } ] }
13、高亮排序-highlight
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮
ES可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置
在是用match查询的同时,加上一个highlight属性:
- pre_tags:前置标签
- post_tags:后置标签
- fields:需要高亮的字段
- title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空
发送GET请求:{{es_url}}/student/_search
//请求体 { "query": { "match": { "name": "zhangsan" } }, "highlight": { "pre_tags": "<font color='red'>", "post_tags": "</font>", "fields": { "name": {} } } }
14、分页查询-from&size
- from:当前页的起始索引,默认从0开始。from=(pageNum - 1)*size
- size:每页显示条数
发送GET请求:{{es_url}}/student/_search
//请求体 { "query": { "match_all": {} //查询所有,当前一共有5条数据 }, "sort":[{ "age":{ "order":"desc" } }], "from":0, //从0开始 "size":2 //每页显示2条 }
15、聚合查询
聚合允许使用者对ES文档进行统计分析,类似于关系性数据库中的group by,当然还有很多其他的聚合,例如取最大值,最小值,求和,求平均值
发送GET请求:{{es_url}}/student/_search
//求最大值 { "aggs":{ "max_age":{ "max":{"field":"age"} } }, "size":0 } //求最小值 { "aggs":{ "min_age":{ "min":{"field":"age"} } }, "size":0 } 求和 { "aggs":{ "sum_age":{ "sum":{"field":"age"} } }, "size":0 } 求平均值 { "aggs":{ "avg_age":{ "avg":{"field":"age"} } }, "size":0 } //去重后求和 { "aggs":{ "distinct_age":{ "cardinality":{"field":"age"} } }, "size":0 } //State聚合-->stats聚合对某个字段一次性返回count,max,min,avg和sum五个指标 { "aggs":{ "stats_age":{ "stats":{"field":"age"} } }, "size":0 }
16、桶聚合查询
桶聚合相当于sql中的group by语句
1)terms聚合,分组统计
发送GET请求:{{es_url}}/student/_search
//请求体
"aggs": {
"age_groupby": {
"terms": {
"field": "age"
}
}
},
"size": 0
}
2)在terms分组下载进行聚合
发送GET请求:{{es_url}}/student/_search
//请求体 { "aggs":{ "age_groupby":{ "terms":{"field":"age"}, "aggs":{ "sum_age":{ "sum":{"field":"age"} } } } }, "size":0 }