说明
- 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": [ "<em>张</em><em>三</em>" ] } } ] } }
-
》》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 } } }
-
-