一、简介
项目环境:
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
范围查询:文章来源地址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;
}
三、注意事项
- es entity 的日期格式问题,不支持
yyyy-MM-dd HH:mm:ss
,需要通过format设置格式。 - text 类型的字段,汉字可以进行分词模糊查询,但是数字不能分词查询。(经过我的测试发现)。
- 分页从0开始(和SpringDataJPA的用法类似)。
到了这里,关于SpringBoot整合Elasticsearch实现分页条件查询及注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!