SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】

这篇具有很好参考价值的文章主要介绍了SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。
程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发

elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容。
本项目数据库使用的是 MySql ,查询数据使用的是 ElasticSearch

elasticsearch spring 分页,SpringBoot,java点滴积累,elasticsearch,spring boot,java
本文章接 SpringBoot ElasticSearch 【SpringBoot系列16】

ES 中的数据查询基本步骤:

  • 第一步,创建SearchRequest对象,指定索引库名
  • 第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等
  • 第三步,利用client.search()发送请求,得到响应
  • 第四步 解析数据
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class ESDocumentTests {

    @Resource
    RestHighLevelClient restHighLevelClient;
    @Test
    void testMatchAll() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("order");
        // 2.准备DSL
        request.source()
                .query(QueryBuilders.matchAllQuery());
        // 3.发送请求
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);

        // 4.解析响应
        handleResponse(response);
    }

    private void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        log.info("共搜索到" + total + "条数据");
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化
            Order order = JSON.parseObject(json, Order.class);
            log.info("查询到数据 {}",order);
        }
    }
}
1 精确查询

上述查询中,QueryBuilders.matchAllQuery() 就是查询条件,在这里没有设置任何筛选条件,所以默认返回前10条数据。

     request.source()
             .query(QueryBuilders.matchAllQuery());

如果要实现精确查询,需要构建查询条件:

 @Test
 public void testBool() throws IOException {
     // 1.准备Request
     SearchRequest request = new SearchRequest("order");
     // 2.准备DSL
     // 2.1.准备BooleanQuery
     BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
     // 2.2.添加term
     boolQuery.must(QueryBuilders.termQuery("goodsName", "手机"));
     // 2.3.添加range
     boolQuery.filter(QueryBuilders.rangeQuery("goodsPrice").lte(250));
     //排序 
     request.source().query(boolQuery);
     // 3.发送请求
     SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
     // 4.解析响应
     handleResponse(response);

 }

核心就是这里的条件

  • term:词条精确匹配
  • range:范围查询
     // 2.2.添加term
     boolQuery.must(QueryBuilders.termQuery("goodsName", "手机"));
     // 2.3.添加range
     boolQuery.filter(QueryBuilders.rangeQuery("goodsPrice").lte(250));
2 查询结果排序与分页

elasticsearch spring 分页,SpringBoot,java点滴积累,elasticsearch,spring boot,java
elasticsearch 在集群模式下,查询TOP1000的数据,例如我集群有5个节点,就必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000。
elasticsearch spring 分页,SpringBoot,java点滴积累,elasticsearch,spring boot,java
当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

    @Test
    public void testPageAndSort() throws IOException {
        // 页码,每页大小
        int page = 1, size = 5;

        // 1.准备Request
        SearchRequest request = new SearchRequest("order");
        // 2.准备DSL
        // 2.1.query
        request.source().query(QueryBuilders.matchAllQuery());
        // 2.2.排序 sort
        request.source().sort("price", SortOrder.ASC);
        // 2.3.分页 from、size
        request.source().from((page - 1) * size).size(5);
        // 3.发送请求
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        handleResponse(response);

    }

核心代码就是

  • sort 排序
  • from 分页
  // 2.2.排序 sort
  request.source().sort("price", SortOrder.ASC);
  // 2.3.分页 from、size
  request.source().from((page - 1) * size).size(5);
3 本项目实现的 订单分页查询
@Api(tags = "订单模块")
@RestController()
@RequestMapping("/orders")
@Slf4j
public class OrderController {
    @Autowired
    private OrderService orderService;
  
    /**
     * 查询用户所有的订单
     */
    @PostMapping("/list")
    public PageResult listFromList(@RequestHeader Long userId,
                                   @RequestBody RequestParams params) {
        PageResult pageResult = orderService.listFromList(userId,params);
        return pageResult;
    }

}

PageResult 是分页信息类

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class PageResult {
    /**
     * 当前页码
     */
    private int pageNum;
    /**
     * 每页数量
     */
    private int pageSize;
    /**
     * 记录总数
     */
    private long totalSize;
    /**
     * 页码总数
     */
    private int totalPages;
    /**
     * 数据模型
     */
    private List<?> content;

    public PageResult(long total, List<Order> orderList) {
        this.content = orderList;
        this.totalSize = total;
    }
}

RequestParams 是查询条件 ,包括了分页信息以及订单的状态

@Data
@AllArgsConstructor
public class RequestParams implements Serializable {
    Integer page;
    Integer pageSize;
    Integer statues;
}

最后就是实现订单的分页查询

   @Resource
   RestHighLevelClient restHighLevelClient;
   /**
    * 分页查询用户的订单
    *
    * @param userId
    * @param params
    * @return
    */
   @Override
   public PageResult listFromList(Long userId, RequestParams params) {
       try {
           // 1.准备Request
           SearchRequest request = new SearchRequest("order");
           // 2.准备DSL
           // 1.构建BooleanQuery
           BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

           //查询对应用户的
           boolQuery.must(QueryBuilders.matchQuery("userId", userId));
           //订单状态
           if (params.getStatues() != null && params.getStatues()>=0) {
               boolQuery.filter(QueryBuilders.termQuery("status", params.getStatues()));
           }

           // 分页
           int page = params.getPage();
           int size = params.getPageSize();
           request.source().from((page - 1) * size).size(size);

           // 3.发送请求
           SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
           // 4.解析响应
           return handleResponse(response);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }

   }

   // 结果解析
   private PageResult handleResponse(SearchResponse response) {
       // 4.解析响应
       SearchHits searchHits = response.getHits();
       // 4.1.获取总条数
       long total = searchHits.getTotalHits().value;
       // 4.2.文档数组
       SearchHit[] hits = searchHits.getHits();
       // 4.3.遍历
       List<Order> hotels = new ArrayList<>();
       for (SearchHit hit : hits) {
           // 获取文档source
           String json = hit.getSourceAsString();
           // 反序列化
           Order hotelDoc = JSON.parseObject(json, Order.class);
           // 放入集合
           hotels.add(hotelDoc);
       }
       // 4.4.封装返回
       return new PageResult(total, hotels);
   }

elasticsearch spring 分页,SpringBoot,java点滴积累,elasticsearch,spring boot,java

4 订单的其他操作

ES 中查询订单详情

    @Override
    public Order getOrderDetailFromEs(Long orderId) {
        // 创建获取请求对象
        GetRequest getRequest = new GetRequest("order", "83");
        try {
            GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
            if(response.isExists()){
                log.info("查询到详情 {}",response.getSourceAsString());
                Order hotelDoc = JSON.parseObject(response.getSourceAsString(), Order.class);
                return hotelDoc;
            }else{
                log.error("未消查询到详情");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return null;
    }

ES 中修改订单状态

    /**
     * 更新ES中订单的状态
     * @param statues
     */
    public void updateOrderStatues(Long orderId,Integer statues) {

        // 设置商品更新信息
        Order goods = new Order();
        goods.setStatus(statues);


        // 将对象转为json
        String data = JSON.toJSONString(goods);
        // 创建索引请求对象
        UpdateRequest updateRequest = new UpdateRequest("order", orderId.toString());
        // 设置更新文档内容
        updateRequest.doc(data, XContentType.JSON);
        // 执行更新文档
        UpdateResponse response = null;
        try {
            response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        log.info("更新状态:{}", response.status());
    }

ES 中新增一条订单数据

    /**
     * 下单成功的时候 把数据保存到ES中
     * @param order
     */
    private void saveOrderToEs(Order order){
        // 将对象转为json
        String data = JSON.toJSONString(order);
        // 创建索引请求对象
        // 参数一 索引库名  参数二文档名称
        IndexRequest indexRequest = new IndexRequest("order").id(order.getId() + "");
        // 准备JSON文档
        indexRequest.source(data, XContentType.JSON);
        // 执行增加文档
        IndexResponse response = null;
        try {
            response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            log.info("创建状态:{}", response.status());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

项目源码在这里 :https://gitee.com/android.long/spring-boot-study/tree/master/biglead-api-12-es
有兴趣可以关注一下公众号:biglead文章来源地址https://www.toymoban.com/news/detail-699863.html


  1. 创建SpringBoot基础项目
  2. SpringBoot项目集成mybatis
  3. SpringBoot 集成 Druid 数据源【SpringBoot系列3】
  4. SpringBoot MyBatis 实现分页查询数据【SpringBoot系列4】
  5. SpringBoot MyBatis-Plus 集成 【SpringBoot系列5】
  6. SpringBoot mybatis-plus-generator 代码生成器 【SpringBoot系列6】
  7. SpringBoot MyBatis-Plus 分页查询 【SpringBoot系列7】
  8. SpringBoot 集成Redis缓存 以及实现基本的数据缓存【SpringBoot系列8】
  9. SpringBoot 整合 Spring Security 实现安全认证【SpringBoot系列9】
  10. SpringBoot Security认证 Redis缓存用户信息【SpringBoot系列10】
  11. SpringBoot 整合 RabbitMQ 消息队列【SpringBoot系列11】
  12. SpringBoot 结合RabbitMQ与Redis实现商品的并发下单【SpringBoot系列12】
  13. SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
  14. SpringBoot RabbitMQ 延时队列取消订单【SpringBoot系列14】
  15. SpringBoot RabbitMQ 商品秒杀【SpringBoot系列15】
  16. SpringBoot ElasticSearch 【SpringBoot系列16】

到了这里,关于SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES(Elasticsearch)+SpringBoot实现分页查询

    1.ES介绍   ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,

    2024年02月16日
    浏览(47)
  • SpringBoot 整合ElasticSearch实现模糊查询,批量CRUD,排序,分页,高亮

    准备一个空的SpringBoot项目 写入依赖 注意你的SpringBoot和你的es版本,一定要对应,如果不知道的可以查看这篇文章:https://blog.csdn.net/u014641168/article/details/130386872 我的版本是2.2.6,所以用的ES版本是 6.8.12,安装es请看这篇文章:https://blog.csdn.net/u014641168/article/details/130622430 查看

    2024年02月08日
    浏览(53)
  • Springboot集成ElasticSearch实现简单的crud、简单分页、模糊查询

    pom.xml引入ElasticSearch application.yml配置 启动类加入注解@EnableElasticsearchRepositories ElasticSearchEntity Repository类继承ElasticsearchRepository ElasticSearchService ElasticSearchController 测试 查看创建的索引(相当于MySQL的表) method:GET 删除索引 method:DELETE 查看索引里的全部数据, elastic是实体类

    2023年04月18日
    浏览(51)
  • SpringBoot整合Elasticsearch实现分页条件查询及注意事项

    项目环境: springboot 2.3.7.RELEASE es 6.8.3 这里需要注意es中日期格式,ES默认是不支持yyyy-MM-dd HH:mm:ss格式的,需要通过 @Field(type = FieldType.Date, format = DateFormat.custom,pattern = \\\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_second\\\") 来指定日期格式。 直接看业务层实现分页条件查询: 范围查询: es en

    2023年04月16日
    浏览(50)
  • Elasticsearch - 闲聊ElasticSearch中的分页

    ElasticSearch是一款强大的搜索引擎,它能够帮助我们快速地搜索海量数据。然而,在处理大量数据时,ElasticSearch的性能可能会受到影响。其中一个常见的问题是深度分页,也就是当我们需要获取大量数据时,ElasticSearch需要处理的数据量太大,导致性能下降。 Elasticsearch 深度分

    2024年02月11日
    浏览(37)
  • ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll

    01. 数据准备 ElasticSearch 向 my_index 索引中索引了 12 条文档: 02. ElasticSearch 如何查询所有文档? ElasticSearch 查询所有文档 根据查询结果可以看出,集群中总共有12个文档,hits.total.value=12, 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档? 03. ElasticSearch 如何指定搜

    2023年04月08日
    浏览(47)
  • Springboot整合Elasticsearch新版分页查询

    其它插入、删除、简单查询都可以通过Repository调用方法查询。 Elasticsearch现在的新版本已经弃用了ElasticsearchTemplate类,Repository里原来的search方法也已经弃用了。下面是使用ElasticsearchRestTemplate类实现的分页查询 代码

    2024年02月11日
    浏览(37)
  • MyBatisPlus(SpringBoot版)的分页插件

    目录  一、前置工作:         1.整体项目目录结构         2.创建普通javamaven项目。         3.导入依赖,改造成springboot项目         4.配置启动类         5.创建service接口及其实现类        6.创建接口Mapper                  7.配置数据源         8.创建数

    2024年04月27日
    浏览(45)
  • 【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定

    MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手,效率极高,快快与我一同领略Plus的独特魅力吧 1.调用方法传入参数获取返回值 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数,执行分页查询并获取其结果 2.设置分页拦截器 将MP提供的分页

    2024年01月17日
    浏览(41)
  • 重构优化第三方查询接口返回大数据量的分页问题

    # 问题描述      用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~      1、经排除是调用第三方数据量达10w条响应会超时,数据没正常返回      2、现有线上缓存分页也是加载慢数据不能正常展示      3、第三方接口返回类似报文jsonj:           4、我

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包