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

这篇具有很好参考价值的文章主要介绍了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

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

范围查询:文章来源地址https://www.toymoban.com/news/detail-414661.html

闭区间:   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的用法类似)。

到了这里,关于SpringBoot整合Elasticsearch实现分页条件查询及注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • springboot整合elasticsearch8组合条件查询

    整合过程见上一篇文章 springboot整合elasticsearch8 1.es8多条件组合查询 2.使用scroll进行大数据量查询

    2024年02月16日
    浏览(40)
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询

    01. ElasticSearch 布尔查询是什么? 在实际应用中,我们很有可能会查询多个值或字段。 一个 bool 查询由三部分组成: must:所有的语句都必须(must) 匹配,与 AND 等价。 must_not:所有的语句都不能(must not)匹配,与 NOT 等价。 should:至少有一个语句要匹配,与 OR 等价。 02.

    2023年04月08日
    浏览(57)
  • java 整合ES实现文档增删改查(多条件分页查询)

    本文采用ES版本为8.7.1 由于只存储文章,仅用固定索引即可,索引用kibanna直接生成,省略索引部分的增删查步骤 抓取返回信息是因为版本问题无法解析ES返回的正确信息,实际操作成功但是会报错 我这边只需要单索引操作,有需求的可以让前端传过来

    2024年02月13日
    浏览(29)
  • ElasticSearch系列 - SpringBoot整合ES:查询条件 query 和过滤条件 filter 的区别

    01. Elasticsearch 查询条件和过滤条件的区别? Elasticsearch中的查询条件和过滤条件都是用于搜索和过滤文档的条件,但它们之间有一些区别。 查询条件是用于计算文档相关度得分的条件,它会将所有符合条件的文档按照相关度得分从高到低排序,并返回前N个文档。查询条件可以

    2024年02月14日
    浏览(45)
  • 【案例实战】SpringBoot整合Redis实现缓存分页数据查询

    正式观看本文之前,设想一个问题,高并发情况下,首页列表数据怎么做? 类似淘宝首页,这些商品是从数据库中查出来的吗?答案肯定不是,在高并发的情况下,数据库是扛不住的,那么我们要怎么去扛住C端大并发量呢,这块我们可以借助Redis,我们知道Redis是一个基于内

    2024年02月09日
    浏览(43)
  • SpringBoot整合mybatis-plus实现分页查询(建议收藏)

    一、前言         最近学习了SpringBoot分页查询的两种写法,一种是手动实现,另一种是使用框架实现。现在我将具体的实现流程分享一下。 二、手动实现分页查询         先复习一下,SQL中的limit,下面一行sql语句的意思是从第二个数据开始查,查询出两条数据

    2024年01月16日
    浏览(58)
  • ES(Elasticsearch)+SpringBoot实现分页查询

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

    2024年02月16日
    浏览(37)
  • ElasticSearch学习简单使用(索引、文档、分页查询、多条件查询)

    APIfox接口在线文档 安装连接 下载链接(各个系统,也包括docker) 打开 我下载的时window版本,直接就是zip压缩包解压后直接使用 执行bin目录下的这个bat文件,就会自动打开终端运行了。 大部分使用http请求进行学习。 你需要一个接口工具,postman,APIfox,或者一些浏览器插件

    2024年02月03日
    浏览(34)
  • SpringBoot ElasticSearch 实现订单的分页查询 【SpringBoot系列17】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海

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

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

    2023年04月18日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包