首先区分下match,match_phrase,term, 参考:https://zhuanlan.zhihu.com/p/592767668?utm_id=0
1、全量查询+分页+指定source
示例:请求地址为http://127.0.0.1:9200/students/_search,请求体为:
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2,
"_source": [
"姓名",
"年级",
"班级"
],
"sort": {
"班级": {
"order": "desc"
}
}
}
- 请求体中的match_all表示匹配所有
- 请求体中from和size用于分页查询,from表示第一个元素的位置(从0开始),size表示要查询的数量。
- 请求体中_source是一个列表,指定要查询的列。
- 请求体中的sort用于结果排序,order取值asc(升序),desc(降序)
- 返回结果中的took表示查询耗时
2. 单条件查询
查询5年级的学生,请求body:
{
"query": {
"match": {
"年级":5
}
}
}
- 请求体中match表示匹配一个条件
3. 多条件查询
3.1 基本多条件查询
3.1.1 多个条件同时匹配
查询5年级2班的学生,请求body:
{
"query": {
"bool": {
"must": [
{
"match": {
"年级": 5
}
},
{
"match": {
"班级": 2
}
}
]
}
}
}
- bool 表示一个条件,条件为true表示匹配,false表示不匹配,其下可以使用must,should,filter等多个条件。
- must可以设置多个条件,是一个数组,表示其下的条件必须全部匹配
- 把must改为should,表示其下的条件满足一个即可
3.1.2 满足至少一个条件
查找1班和2班的学生:
{
"query": {
"bool": {
"should": [
{
"match": {
"班级": 1
}
},
{
"match": {
"班级": 2
}
}
]
}
}
}
3.1.3 范围查询
must表示多个条件同时满足,should表示至少匹配一个条件,filter表示过滤查询;范围使用range匹配(和match,match_all相同,指定具体条件)。
例如查询5年级1班和2班的学生:
{
"query": {
"bool": {
"must": [
{
"match": {
"年级": 5
}
}
],
"filter": {
"range": {
"班级": {
"gte": 1,
"lte": 2
}
}
}
}
}
}
4. 分组查询(聚合查询)
{
"aggs": {
"班级分组": {
"terms": {
"field": "班级"
}
}
}
}
更多的时候,我们只想要分组统计,不需要查询原始数据,可以设置查询size为0
{
"aggs": {
"班级分组": {
"terms": {
"field": "班级"
}
}
},
"size": 0
}
- 请求中的terms表示分组统计,其他的关键字还有:avg(对field指定的字段取平均值)