ElasticSearch的高级查询之条件查询、全量查询、排序、分页、范围查询、全文检索、完全匹配、内容高亮、聚合查询既然是查询,那么统一GET请求方式官方文档:https://www.elastic.co/cn/本案例只是列出了一些比较常用的查询操作,更详细的聚合查询请参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/index.html(包含所有支持的聚合查询方式,绝对够喝一壶了~)
主要都在:Search your data和Aggregations两个章节中。 常用操作 》纯URL方式
请求格式:/<索引名称>/_searcn?q=<字段名>:<字段值>
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search?q=name:张三
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "tJcja34BW7FmJcLFEhTd",
"_score": 0.5753642,
"_source": {
"id": 1001,
"name": "张三",
"age": 18
}
}
]
}
}
》请求体body方式
统一请求格式:/<索引名称>/_searcn 》》match(条件查询)
match关键字模糊匹配某一个字段
match是全文检索,默认模糊匹配该字段包含目标值中的一个或多个词的结果,会进行分词匹配
使用场景:比如可以查询名字包含张三的数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match": {
"name": "张三"
}
}
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1001",
"_score": 1.9616582,
"_source": {
"id": 1001,
"name": "张三",
"age": 18
}
}
]
}
}
》》match_all(全量查询)
match_all关键字匹配索引下所有文档
一般不会直接这么使用,需要配合分页等使用
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_all": {}
}
}'
响应结果:略
》》from&size(分页)
from&size实现分页
from:从第几条开始取数据
size:取几条数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2
}'
响应结果:略
》》_source(返回字段过滤)
_source关键字接收一个数组,传入需要返回的字段名列表
使用场景:只需要返回结果中的”name“字段,其他字段不需要
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2,
"_source": [
"name"
]
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1002",
"_score": 1.0,
"_source": {
"name": "李四"
}
},
{
"_index": "index001",
"_type": "_doc",
"_id": "1001",
"_score": 1.0,
"_source": {
"name": "张三"
}
}
]
}
}
》》sort(排序)
sort关键字会按照给定的规则对结果进行排序后返回
使用场景:排序规则:请按照用户的age倒序返回数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2,
"sort": {
"age": {
"order": "desc"
}
}
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1003",
"_score": null,
"_source": {
"id": 1003,
"name": "王五",
"age": 20
},
"sort": [
20
]
},
{
"_index": "index001",
"_type": "_doc",
"_id": "1002",
"_score": null,
"_source": {
"id": 1002,
"name": "李四",
"age": 19
},
"sort": [
19
]
}
]
}
}
》》bool(多条件查询)
bool+must+match:多个条件必须同时满足(相当于:&&)
使用场景:匹配名字为张三并且年龄为18的数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": "18"
}
}
]
}
}
}'
响应结果:略
bool+should+match:多个条件至少有一个满足(相当于||)
使用场景:匹配名字为张三或者年龄为19的数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": "19"
}
}
]
}
}
}'
响应结果:略
bool+filter+range:某个值的范围查询,也就是大于或者小于等条件
使用场景:匹配年龄大于等于19并且小于20的数据
请求示例
请求方式:GET
发送请求(写法一):
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 19,
"lt": 20
}
}
}
}
}
}'
发送请求(写法二):
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"bool": {
"filter": [
{
"range": {
"age": {
"gte": 19
}
}
},
{
"range": {
"age": {
"lt": 20
}
}
}
]
}
}
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1002",
"_score": 0.0,
"_source": {
"id": 1002,
"name": "李四",
"age": 19
}
}
]
}
}
》》match_phrase(完全匹配)
match_phrase关键字精确匹配某一个字段
match_phrase是完全匹配,默认精确匹配该字段等于目标值的结果,不会进行分词匹配
使用场景:比如可以查询名字等于张三的数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_phrase": {
"name": "张三"
}
}
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1001",
"_score": 1.9616582,
"_source": {
"id": 1001,
"name": "张三",
"age": 18
}
}
]
}
}
》》 highlight(内容高亮)
highlight关键字会对指定的字段加入特定标签从而实现高亮显示
使用场景:对匹配到的数据中的name字段高亮显示
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"query": {
"match_phrase": {
"name": "张三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}'
响应结果:
{
...
"hits": {
...
"hits": [
{
"_index": "index001",
"_type": "_doc",
"_id": "1001",
"_score": 1.9616582,
"_source": {
"id": 1001,
"name": "张三",
"age": 18
},
"highlight": {
"name": [
"张三"
]
}
}
]
}
}
》》aggs(聚合查询)
aggs+terms:分组查询某字段值出现的次数(类似于MySQL的count+groupby)
使用场景:比如统计各个年龄的人数
注意:聚合查询除了返回统计结果,还会返回所有命中的原始数据hits,这个往往是不需要的,可以通过给定size=0取消返回原始数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"aggs": {
"my_group": {
"terms": {
"field": "age"
}
}
},
"size": 0
}'
my_group说明:自定义返回数据的键,随意即可
响应结果:
{
...
"hits": {
...
"hits": []
},
"aggregations": {
"my_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 18,
"doc_count": 1
},
{
"key": 19,
"doc_count": 1
},
{
"key": 20,
"doc_count": 1
}
]
}
}
}
aggs+max/min/avg/sum/stats:求某字段的最大值/最小值/平均值/求和/统计
使用场景:比如统计年龄的个数、最小值、最大值、平局值、和
注意:聚合查询除了返回统计结果,还会返回所有命中的原始数据hits,这个往往是不需要的,可以通过给定size=0取消返回原始数据
请求示例
请求方式:GET
发送请求:
curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
"aggs": {
"my_stats": {
"stats": {
"field": "age"
}
}
},
"size": 0
}'
my_avg说明:自定义返回数据的键,随意即可
响应结果:
{
...
"hits": {
...
"hits": []
},
"aggregations": {
"my_stats": {
"count": 3,
"min": 18.0,
"max": 20.0,
"avg": 19.0,
"sum": 57.0
}
}
}



