ES查询之排序查询、分页查询、布尔查询
1|0一、Elasticsearch之排序查询
1|11. 准备数据
1|22. 排序查询:sort
2.1 降序:desc
- 想到排序,出现在脑海中的无非就是升(正)序和降(倒)序。比如我们查询顾府都有哪些人,并根据age字段按照降序,并且,我只想看
nmae
和age
字段:
-
上例,在条件查询的基础上,我们又通过
sort
来做排序,根据age
字段排序,是降序呢还是升序,由order
字段控制,desc
是降序。 -
结果如下:
- 上例中,结果是以降序排列方式返回的。
2.2 升序:asc
- 那么想要升序怎么搞呢?
-
上例,想要以升序的方式排列,只需要将
order
值换为asc
就可以了。 -
结果如下:
- 上例,可以看到结果是以
age
从小到大的顺序返回结果。
1|33. 不是什么数据类型都能排序
- 那么,你可能会问,除了
age
,能不能以别的属性作为排序条件啊?来试试:
- 上例,我们以
name
属性来排序,来看结果:
-
结果跟我们想象的不一样,报错了!
-
注意:在排序的过程中,只能使用可排序的属性进行排序,其他的都不行!那么可以排序的属性有哪些呢?
-
数字
-
日期
-
2|0二、Elasticsearch之分页查询
2|11. 准备数据
2|22. 分页查询:from/size
- 我们来看看elasticsearch是怎么将结果分页的:
-
上例,首先以
age
降序排序,查询所有。并且在查询的时候,添加两个属性from
和size
来控制查询结果集hits中的数据条数(只对hits内的结果条数有影响,后面要介绍的聚合函数的结果不在size和from的控制内
)。-
from参数定义了需要跳过的hits数,默认为0
-
size参数定义了需要返回的hits数目的最大值
-
-
如上例的结果:
-
上例中,在返回的结果集中,从第2条开始,返回1条数据。
-
那如果想要从第2条开始,返回2条结果怎么做呢?
-
上例中,我们指定
from
为2,意为从第2条开始返回,返回多少呢?size
意为2条。 -
还可以这样:
-
上例中,从第4条开始返回2条数据。
-
结果如下:
-
上例中仅有一条数据,那是为啥呢?因为我们现在只有5条数据,从第4条开始查询,就只有1条符合条件,所以,就返回了1条数据。
-
到这里,我们也可以看到,我们的查询条件越来越多,开始仅是简单查询,慢慢增加条件查询,增加排序,对返回结果进行限制。所以,我们可以说:对于
elasticsearch
来说,所有的条件都是可插拔的,彼此之间用,
分割。比如说,我们在查询中,仅对返回结果进行限制:
- 上例中,在所有的返回结果中,结果从4开始返回2条数据。
- 但我们只有1条符合条件的数据。
3|0三、Elasticsearch之布尔查询
3|11. 前言
-
布尔查询是最常用的组合查询,用到了
bool
关键字。根据其内的子查询的规则,只有当文档满足所有子查询条件时,elasticsearch引擎才将结果返回。布尔查询支持的子查询条件共4种:-
must(and)
-
should(or)
-
must_not(not)
-
filter
-
-
下面我们来看看每个子查询条件都是怎么玩的。
3|22. 准备数据
3|33. must
- 现在,我们用布尔查询所有
from
属性为gu
的数据:
-
上例中,我们通过在
bool
属性(字段)内使用must
来作为查询条件,那么条件是什么呢?条件同样被match
包围,就是from
为gu
的所有数据。 -
这里需要注意的是
must
字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回。 -
结果如下:
-
上例中,可以看到,所有
from
属性为gu
的数据查询出来了。 -
那么,我们想要查询
from
为gu
,并且age
为30
的数据怎么搞呢?
-
上例中,在
must
列表中,在增加一个age
为30
的条件。 -
结果如下:
-
上例,符合条件的数据被成功查询出来了。
-
注意:现在你可能慢慢发现一个现象,所有属性值为列表的,都可以实现多个条件并列存在
3|44. should
- 那么,如果想查询只要是
from
为gu
或者tags
为闭月
的数据怎么搞?
-
上例中,或关系的不能用
must
的了,而是要用should
,只要符合其中一个条件就返回。 -
结果如下:
- 返回了所有符合条件的结果。
3|55. must_not
- 那么,如果我想要查询
from
既不是gu
并且tags
也不是可爱
,还有age
不是18
的数据怎么办?
- 上例中,
must
和should
都不能使用,而是使用must_not
,又在内增加了一个age
为18
的条件。
结果如下:
- 上例中,只有魏行首这一条数据,因为只有魏行首既不是顾家的人,标签没有可爱那一项,年龄也不等于18
- 这里有点需要补充,条件中
age
对应的18
你写成整形还是字符串都没啥区别……
3|66. filter
- 那么,如果要查询
from
为gu
,age
大于25
的数据怎么查? - 范围查询用到了关键字
range
,其内部可以跟多个条件
-
这里就用到了
filter
条件过滤查询,过滤条件的范围用range
表示,gt
表示大于,大于多少呢?是25。 -
结果如下:
-
上例中,
age
大于25
的条件都已经筛选出来了。 -
那么要查询
from
是gu
,age
大于等于30
的数据呢?
-
上例中,大于等于用
gte
表示。 -
结果如下:
- 那么,要查询
age
小于25
的呢?
- 上例中,小于用
lt
表示,结果如下:
- 在查询一个
age
小于等于18
的怎么办呢?
- 上例中,小于等于用
lte
表示。结果如下:
- 要查询
from
是gu
,age
在25~30
之间的怎么查?
- 上例中,使用
lte
和gte
来限定范围。结果如下:
- 那么,要查询
from
是sheng
,age
小于等于25
的怎么查呢?其实结果,我们可能已经想到了,只有一条,因为只有盛家小六符合结果。
- 结果果然不出洒家所料!
- 但是,洒家手一抖,将
must
换为should
看看会发生什么?
- 结果如下:
-
结果有点出乎意料,因为龙套偏房和魏行首不属于盛家,但也被查询出来了。那你要问了,怎么肥四?小老弟!这是因为在查询过程中,优先经过
filter
过滤,因为should
是或关系,龙套偏房和魏行首的年龄符合了filter
过滤条件,也就被放行了!所以,如果在filter
过滤条件中使用should
的话,结果可能不会尽如人意!建议使用must
代替。 -
注意:
filter
工作于bool
查询内。比如我们将刚才的查询条件改一下,把filter
从bool
中挪出来。
- 如上例所示,我们将
filter
与bool
平级,看查询结果:
- 结果报错了!所以,
filter
工作位置很重要。
3|77. 小结:
-
must
:与关系,相当于关系型数据库中的and
。 -
should
:或关系,相当于关系型数据库中的or
。 -
must_not
:非关系,相当于关系型数据库中的not
。 -
filter
:过滤条件。 -
range
:条件筛选范围。 -
gt
:大于,相当于关系型数据库中的>
。 -
gte
:大于等于,相当于关系型数据库中的>=
。 -
lt
:小于,相当于关系型数据库中的<
。 -
lte
:小于等于,相当于关系型数据库中的<=
。
__EOF__

本文链接:https://www.cnblogs.com/Mcoming/p/18123627.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下