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>

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;
    }
}

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;

}

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)
    /**
     * 注意 数字字符串不会进行分词,中文可以分词
     * 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. es entity 的日期格式问题,不支持yyyy-MM-dd HH:mm:ss,需要通过format设置格式。
  2. text 类型的字段,汉字可以进行分词模糊查询,但是数字不能分词查询。(经过我的测试发现)。
  3. 分页从0开始(和SpringDataJPA的用法类似)。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值