• SpringBoot整合Elasticsearch实现分页条件查询及注意事项


    一、简介

    项目环境:
    springboot 2.3.7.RELEASE
    es 6.8.3

    二、分页条件查询

    2.1 pom.xml

    <!-- 由于SpringBoot版本是2.3.7.RELEASE,spring-data-elasticsearch默认集成的是es7.6,所以需要
        手动指定一下es版本,否则版本会报错-->
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.3</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.8.3</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.8.3</version>
        </dependency>
        <!--elasticsearch-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.plugin</groupId>
                    <artifactId>transport-netty4-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <!-- 引入 Google 的集合工具包 -->
        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
        </dependency>
    
    </dependencies>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    2.2 es配置类

    /**
     * @author :LiuShihao
     * @date :Created in 2022/6/23 12:00 上午
     * @desc :配置es集群
     */
    @Configuration
    public class ElasticsearchConfig {
    
        @Bean
        RestHighLevelClient elasticsearchClient() {
            ClientConfiguration configuration = ClientConfiguration.builder()
                    //使用es 9200 端口
                    .connectedTo("47.100.241.202:9200")
                    //.withConnectTimeout(Duration.ofSeconds(5))
                    //.withSocketTimeout(Duration.ofSeconds(3))
                    //.useSsl()
                    //.withDefaultHeaders(defaultHeaders)
                    //.withBasicAuth(username, password)
                    // ... other options
                    .build();
            RestHighLevelClient client = RestClients.create(configuration).rest();
            return client;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.3 entity

    这里需要注意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")
    来指定日期格式。

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Document(indexName = "test_data")
    public class WarnData {
    
        @Id
        @Field(type = FieldType.Text)
        private String id;
    
        @Field(type = FieldType.Text)
        private String province_code;
    
        @Field(type = FieldType.Text)
        private String city_code;
    
        @Field(type = FieldType.Text)
        private String area_code;
    
    
        //ES默认是不支持yyyy-MM-dd HH:mm:ss格式的
        @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
        @Field(type = FieldType.Date, format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_second")
        private String receive_time;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.4 service

    直接看业务层实现分页条件查询:

    范围查询:

    闭区间:   where age >=2 and age <=4    QueryBuilders.rangeQuery("age").from(age1).to(age2)
    开区间:   where age >2 and age <4      QueryBuilders.rangeQuery("age").from(age1,false).to(age2,false)
    大于:    where age >1                  QueryBuilders.rangeQuery("age").gt(age)
    大于等于: where age >=1                 QueryBuilders.rangeQuery("age").gte(age1)
    小于:    where age <4                  QueryBuilders.rangeQuery("age").lt(age1)
    小于等于: where age <=4                 QueryBuilders.rangeQuery("age").lte(age1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
        /**
         * 注意 数字字符串不会进行分词,中文可以分词
         * matchQuery 相当于like 模糊查询  会进行分词,必须是text类型
         * matchPhraseQuery 查询 相当于 = ,不会进行分词
         * termQuery 等值搜索:相当于sql语句中的“=”,使用这个搜索一般是对索引中keyword的mapping进行等值搜索。term query 属于过滤器查询,可以处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)
         * 组合查询 : must(and,必须匹配)、should(or,或者)、mustNot(!=,必须不匹配)
         *
         * @param searchDataDto
         * @return
         */
        @Override
        public Page<WarnData> find(SearchDataDto searchDataDto) {
            int pageNum = searchDataDto.getPageNum() == null ? 1: searchDataDto.getPageNum();
            int pageSize = searchDataDto.getPageSize() == null ? 10: searchDataDto.getPageSize();
            //创建查询对象
            BoolQueryBuilder base_query = QueryBuilders.boolQuery();
            if (searchDataDto.getId() != null && !"".equals(searchDataDto.getId())){
                base_query.must(QueryBuilders.termQuery("id",searchDataDto.getId() ));
            }
    
            if (searchDataDto.getProvinceCode() != null && !"".equals(searchDataDto.getProvinceCode())){
                base_query.must(QueryBuilders.termQuery("province_code",searchDataDto.getProvinceCode() ));
            }
            if (searchDataDto.getCityCode() != null && !"".equals(searchDataDto.getCityCode())){
                base_query.must(QueryBuilders.termQuery("city_code",searchDataDto.getCityCode() ));
            }
            if (searchDataDto.getAreaCode() != null && !"".equals(searchDataDto.getAreaCode())){
                base_query.must(QueryBuilders.termQuery("area_code",searchDataDto.getAreaCode() ));
            }
            if (searchDataDto.getPoliceCode() != null && !"".equals(searchDataDto.getPoliceCode())){
                base_query.must(QueryBuilders.termQuery("police_code",searchDataDto.getPoliceCode() ));
            }
            //时间范围查询
            if(searchDataDto.getReceivingStartTime()!=null && !"".equals(searchDataDto.getReceivingStartTime())){
                base_query.must(QueryBuilders.rangeQuery("receive_time").
                        gte(searchDataDto.getReceivingStartTime()));//大于等于开始时间
            }
            if(searchDataDto.getReceivingEndTime()!=null && !"".equals(searchDataDto.getReceivingEndTime()) ){
                base_query.must(QueryBuilders.rangeQuery("receive_time").
                        lte(searchDataDto.getReceivingEndTime()));//小于等于结束时间
            }
            
            //设置分页和根据创建时间降序排序  注意:page从0开始
            PageRequest page = PageRequest.of
                    (pageNum-1, pageSize, Sort.by(Sort.Order.desc("receive_time")));
            Page<WarnData> data = esWarnDataRepository.search(base_query, page);
    
            return data;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    三、注意事项

    1. es entity 的日期格式问题,不支持yyyy-MM-dd HH:mm:ss,需要通过format设置格式。
    2. text 类型的字段,汉字可以进行分词模糊查询,但是数字不能分词查询。(经过我的测试发现)。
    3. 分页从0开始(和SpringDataJPA的用法类似)。
  • 相关阅读:
    浅谈JWT(Json Web Token)
    Java字符集/编码集
    计算机高质量公开课程整理(长期整理)
    SpringCloud学习笔记(四)
    android java.io.FileNotFoundException: xxxx (Permission denied)解决办法略解
    第二十二次CCF计算机软件能力认证
    在金融行业做数据产品经理是什么体验
    【NodeJs入门学习】node服务环境搭建
    Excel之数据透视&NotePad之列编辑
    传智健康_第6章 移动端开发-体检预约
  • 原文地址:https://blog.csdn.net/DreamsArchitects/article/details/125531228