专栏首页零基础自学Java【微服务】162:利用Java实现索引库相关的分页、排序和聚合

【微服务】162:利用Java实现索引库相关的分页、排序和聚合

学习计划安排,利用Java代码来实现对索引库的各种操作:

  • 通过自定义方法实现匹配查询、范围查询。
  • 原生的查询代码又是如何编写的?
  • 最后还有聚合相关的代码编写。

一、自定义方法

昨天学了最基础的几种增删改查方法,但查询在实际应用中显然没这么简单。

比如用户要匹配查询,前几天我们有学过,有match匹配和term匹配两种常用的方式。

这些在Java中又是哪些方法来对应呢?

有原生的方法可以是使用,但是比较麻烦,这里使用springdata提供的自定义方法。

1自定义方法实现多种查询方法

昨天有使用到findAll()方法,这是自带的方法,看其语义也就能知道其实查询所有数据。

但是很多时候并不是一个查询所有方法就能解决的,所以需要自己自定义说明。

①queryItemsByTitleMatchs

方法名一定要按照其格式来,一看到也就很好理解,是根据Title这个字段匹配查询。

其中后面还可以接“And”“Or”这些逻辑运算,实现布尔查询。

②queryItemsByPriceBetween

一样的道理,范围查询也有其格式,也就是between这个单词的使用。

总之:自定义方法之后,不需要我们写具体是如何查询的了,可以直接使用,但是方法名需要遵循命名规范,如果不能正常使用,极有可能就是方法名格式不对。

2自定义方法的使用

①根据Title词条匹配

直接调用自定义的match匹配方法,在参数中说明要搜索的关键字是“小米手机”,这样就能match匹配到和“小米手机”相关的数据了。

②根据price范围查询

直接调用自定义的范围查询方法,在参数中说明价格区间是2000-4000,这样也就能范围查询出这个价格区间相关的数据了。

3运行方法,观察结果

①“小米手机”匹配结果

这个前几天专门说明过,因为title这个字段类型是text,是要分词的,所以“小米手机”被分词成了“小米”和“手机”。

只要是和上述分词相关的数据都会被查询出来,所以“坚果手机”也被查询出来了。

②价格在2000-4000区间的数据

结果也就显而易见了,如上图所示。

二、原生的查询

自定义方法虽然很简单,但有时候不能很好地实现业务需求,比如查询条件过多时。

这个时候就需要结合官方提供的原生查询了。

①创建查询的构造器

NativeSearchQueryBuilder也就是原生搜索查询构造器的意思,通过它也就可以添加各种查询条件。

②添加查询条件

withQuery():QueryBuilders说明查询

例子中是match匹配查询,所以在Java中也就是matchQuery方法,参数:title是字段,“小米手机”是该字段对应的数据。

withPageable():PageRequest实现分页

of()方法即可实现分页,其中页面数从0页开始,每页大小上述图中指定的是2。

withSort():SortBuilders实现排序

  • fieldSort()方法说明需要排序的字段。
  • order()方法说明排序方式。

其可以链式编程不停地添加查询条件。

③再调用search方法完成查询

使用自定义的itemRepository接口调用search()方法,同时说明查询条件,也就是原生的查询只是说明了下查询条件。

查询结果测试

match匹配“小米手机”,查询数据有3条。

在分页的时候就说明了每页显示2条数据,所以这里一共有2页数据。

当前显示的是首页,也就是第0页。

三、原生的聚合

先对聚合做一个简单的回顾:

其实无外乎还是那核心4个步骤:

  • aggs说明这是一个聚合。
  • 给该聚合自定义一个名称。
  • 说明聚合类型:桶有自己对应到的各种类型,度量也有自己对应的各种类型,上述例子中是桶里面的terms类型。
  • 说明聚合字段:brand。也就是根据brand字段划分成多个桶。

好,这是在Elasticsearch中的使用,那如何用Java代码来操作它呢

①创建构造器

这个和原生的查询一样,都是使用该构造器。

②添加聚合

这一段代码就将聚合的三要素都说清楚了。

聚合名叫什么?叫popularBrand。

聚合是什么类型?terms()方法也就是terms类型,不同的类型在Java中对应不同的方法。

聚合字段是哪个?field说明是brand字段、

③得到聚合结果

使用elasticsearchTemplate查询聚合,返回聚合结果。

④结果解析

这段代码就有点复杂了,我们做一个对比。

利用kibana响应的是一个json数据,Java中的这段代码其实也就是对json数据的解析。

  • getAggregations(),聚合是可以嵌套有多个的,只不过例子中只写了一个聚合。
  • get():根据聚合名找到需要的那个聚合。
  • getBuckets():找到对应的桶数据。json数据中还有一些其它数据,而我们自然需要的也就是buckets数据。
  • 获取桶中对应的数据。

说白了Java对聚合的解析其实也就是对json数据的解析过程,就算不是聚合,其它json数据的解析思路都是一样的。

本文分享自微信公众号 - 刘小爱(liuxiaoai946),作者:刘小爱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【微服务】160:Elasticsearch高级使用

    昨天学了match匹配和term匹配,这是两种最基础也很重要的查询方式,使用起来也简单。

    刘小爱
  • 【微服务】164:商品微服务需要提供的接口

    因为涉及到一个分页查询,所以service层的代码较为复杂,当时详细编写并讲解过其代码实现,在此不再赘述。

    刘小爱
  • 【框架】117:mybatis之动态sql

    主要就学了一个内容,动态sql的使用,它是mybatis框架中非常强大的一个特性。

    刘小爱
  • 【一文打尽】SQL 数据分析常用语句.....收藏

    • 1 基础查询 • 2 字符串\数字\日期时间 • 3 聚合数据查询 • 4 子查询 • 5 联接\组合查询 • 6 高级查询 • 7 更新数据 阅读提醒:点...

    小莹莹
  • 我的Mysql查询SQL优化总结

    当我们遇到一个慢查询语句时,首先要做的是检查所编写的 SQL 语句是否合理,优化 SQL 语句从而提升查询效率。所以对 SQL 有一个整体的认识是有必要的。

    程序员小明
  • 快速学习Oracle-子查询

    子查询:在一个查询的内部还包括另一个查询,则此查询称为子查询。 Sql的任何位置都可以加入子查询。

    cwl_java
  • django-模型之从数据库获取数据(二)

    11.逻辑查询 __gt(大于),__gte(大于等于),__lt(小于),__lte(小于等于)

    绝命生
  • Access生成表查询

    大家好前面已经介绍了选择查询、参数查询、交叉表查询,本节开始介绍操作查询部分内容。

    无言之月
  • kibana使用

    能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意义,虽不会报错,但是,得不到自...

    ydymz
  • 2018-06-04第11章 子查询

    用户1250179

扫码关注云+社区

领取腾讯云代金券