赞
踩
这篇文章,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。
目录
- # 主键查询
- GET /索引名称/_doc/doc文档的id
-
- # 测试案例
- GET /idx_20221124/_doc/2022001
这种查询方式,每一次只能够查询一条doc文档,如果要查询很多doc文档,那么就需要通过【_search】命令。
将查询条件放在请求路径后面,查询条件使用【q=字段名称:字段值】这种格式,如下所示:
- # 单个查询条件
- # 查询age字段等于20的doc文档
- GET /idx_20221124/_search?q=age:20
当查询条件有很多个的时候,如果将所有的查询条件都放在请求路径上面,显然不合适,所以ES可以将查询条件放到请求体里面,请求体里面的查询条件需要按照指定的格式,不然ES会解析报错。
- #
- # 查询
- GET /idx_20221124/_search
- {
- "query": {
- "指定查询类型": {
- "查询字段": "查询值"
- }
- }
- }
-
- # 查询
- GET /idx_20221124/_search
- {
- "query": {
- "match": {
- "age": 20
- }
- }
- }
match关键字,相当于mysql数据库中的like查询,match查询的字段如果是text类型,那么text会被分词,match就会匹配分词,查询所有包含分词的doc文档,如果不是text类型的,那就是精确查询。
match有多种形式,如下所示:
- match:查询指定条件的数据,match会将查询的条件进行分词操作,然后只有doc文档中包含分词,就都会查询出来。
- match_all:查询所有数据。
- match_phrase:匹配短语,match是会查询所有包含分词的doc文档,而match_phrase则是匹配整个短语,才会返回对应的doc文档。
- match_phrase_prefix:匹配短语的前缀部分,这个只能使用在text类型字段。
- # 查询所有数据
- # 查询age等于20的doc文档
- GET /idx_20221124/_search
- {
- "query": {
- "match": {
- "age": 20
- }
- }
- }
match_all表示查询所有的数据,默认是10条,因为ES默认分页是10条数据,这个关键字不能写查询条件。
- # 查询所有数据
- GET /idx_20221124/_search
- {
- "query": {
- "match_all": {}
- }
- }
执行结果:
ES查询时候,默认情况下,会将doc文档中的所有字段都返回,如果查询时候不想查询某个字段,那么可以使用【_source】属性设置查询哪些字段。【_source】就相当于mysql数据库中的【select 字段1,字段2】形式。
【_source】过滤字段:
- 第一种:_source=false,表示所有字段都不返回。
- 第二种:_source: ["username", "age"],只返回指定的字段。
案例代码:
- # 查询数据,不返回字段
- GET /idx_20221124/_search
- {
- "query": {
- "match": {
- "age": 20
- }
- },
- "_source": false
- }
-
- # 查询数据,返回指定字段
- GET /idx_20221124/_search
- {
- "query": {
- "match": {
- "age": 20
- }
- },
- "_source": ["username", "age"]
- }
执行结果:
条件查询,和mysql数据库中的条件查询是类似的,只不过ES中使用JSON的方式来组织查询条件,条件查询基本格式如下所示:
- # 条件查询数据
- GET /索引名称/_search
- {
- "query": {
- "bool": {
- "条件类型": [
- {条件1},
- {条件2}
- ]
- }
- }
- }
条件查询中的【must】和mysql数据库中的【and】是相同作用,【must】接收一个数组,数组中的所有条件都成立,这个时候才会查询对应数据。
- # 查询数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "must": [
- {
- "match": {
- "nickname": "java"
- }
- },
- {
- "match": {
- "age": 25
- }
- }
- ]
- }
- }
- }
执行结果:
既然有and运算,那当然少不了or运算,ES中使用【should】表示或运算,相当于mysql数据库中的【or】连接符。
- # 查询数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "should": [
- {
- "match": {
- "nickname": "java"
- }
- },
- {
- "match": {
- "age": 31
- }
- }
- ]
- }
- }
- }
执行结果:
must_not是非运算,相当于mysql数据库中的【!】非运算,即:【not】。
- # 查询数据
- # 查询年龄不是25的所有doc文档
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "must_not": [
- {
- "match": {
- "age": 25
- }
- }
- ]
- }
- }
- }
执行结果:
filter是用于过滤查询的关键字,在filter里面可以使用多种查询条件,例如:range、term、terms、exists、ids几种常见的查询,这里先介绍range范围查询,范围查询首先需要指定范围,下面是几个常见的范围关键字。
range范围关键字:
- gt:大于。
- lt:小于。
- gte:大于等于。
- lte:小于等于。
- eq:等于。
- ne:不等于。
range范围查询的语句格式:
- # 查询数据
- GET /索引名称/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "range": {
- "指定字段": {
- "条件": 范围值,
- "条件": 范围值
- }
- }
- }
- ]
- }
- }
- }
具体案例代码:
- # 查询数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "range": {
- "age": {
- "gt": 20,
- "lt": 30
- }
- }
- }
- ]
- }
- }
- }
执行结果:
exists关键字,是表示指定的字段的值是否存在,类似于mysql数据库中的【is null】,但是ES中exists用在filter里面时候,表示过滤掉不存在指定字段的doc文档。
- # 查询数据
- # 过滤nickname不存在的doc文档数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "exists": {
- "field": "nickname"
- }
- }
- ]
- }
- }
- }
运行上面语句之后,会返回所有doc文档中,nickname字段不存在的doc文档结果。
注意:exists会返回指定字段存在的doc文档,只有当字段等于null,即:不存在时候才会匹配成功,如果字段等于空字符串不会匹配成功。
ids查询,这就相当于mysql数据库中的【in】条件查询,多个条件值查询,但是这里的只能够对doc文档的id进行多个值查询。
- # 查询数据
- # 查询doc文档id等于:2022001、2022005的数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "ids": {
- "values": [
- "2022001", "2022005"
- ]
- }
- }
- ]
- }
- }
- }
执行结果:
term表示关键字查询,即:判断doc文档里面是否包含给定的term关键字,如果包含,则满足条件,否则不满足。
- # 查询数据
- GET /索引名称/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "term": {
- "字段名称": "字段值"
- }
- }
- ]
- }
- }
- }
-
- # 测试案例
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "term": {
- "username": "java"
- }
- }
- ]
- }
- }
- }
执行结果:
term每次只能够匹配一个关键字,而terms则允许多个关键字匹配。
- # 查询数据
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "terms": {
- "字段名称": [
- "字段值1",
- "字段值2",
- "字段值n"
- ]
- }
- }
- ]
- }
- }
- }
-
- # 测试案例
- GET /idx_20221124/_search
- {
- "query": {
- "bool": {
- "filter": [
- {
- "terms": {
- "username": [
- "java",
- "python"
- ]
- }
- }
- ]
- }
- }
- }
执行结果:
到此,ES中的一些基本查询操作就介绍完啦。
综上,这篇文章结束了,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。