一、簡介
項(xiàng)目環(huán)境:
springboot 2.3.7.RELEASE
es 6.8.3
二、分頁條件查詢
2.1 pom.xml
<!-- 由于SpringBoot版本是2.3.7.RELEASE,spring-data-elasticsearch默認(rèn)集成的是es7.6,所以需要
手動指定一下es版本,否則版本會報(bào)錯(cuò)-->
<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默認(rèn)是不支持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默認(rèn)是不支持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
直接看業(yè)務(wù)層實(shí)現(xiàn)分頁條件查詢:文章來源:http://www.zghlxwxcb.cn/news/detail-414661.html
范圍查詢:文章來源地址http://www.zghlxwxcb.cn/news/detail-414661.html
閉區(qū)間: where age >=2 and age <=4 QueryBuilders.rangeQuery("age").from(age1).to(age2)
開區(qū)間: 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)
/**
* 注意 數(shù)字字符串不會進(jìn)行分詞,中文可以分詞
* matchQuery 相當(dāng)于like 模糊查詢 會進(jìn)行分詞,必須是text類型
* matchPhraseQuery 查詢 相當(dāng)于 = ,不會進(jìn)行分詞
* termQuery 等值搜索:相當(dāng)于sql語句中的“=”,使用這個(gè)搜索一般是對索引中keyword的mapping進(jìn)行等值搜索。term query 屬于過濾器查詢,可以處理數(shù)字(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();
//創(chuàng)建查詢對象
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() ));
}
//時(shí)間范圍查詢
if(searchDataDto.getReceivingStartTime()!=null && !"".equals(searchDataDto.getReceivingStartTime())){
base_query.must(QueryBuilders.rangeQuery("receive_time").
gte(searchDataDto.getReceivingStartTime()));//大于等于開始時(shí)間
}
if(searchDataDto.getReceivingEndTime()!=null && !"".equals(searchDataDto.getReceivingEndTime()) ){
base_query.must(QueryBuilders.rangeQuery("receive_time").
lte(searchDataDto.getReceivingEndTime()));//小于等于結(jié)束時(shí)間
}
//設(shè)置分頁和根據(jù)創(chuàng)建時(shí)間降序排序 注意: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;
}
三、注意事項(xiàng)
- es entity 的日期格式問題,不支持
yyyy-MM-dd HH:mm:ss
,需要通過format設(shè)置格式。 - text 類型的字段,漢字可以進(jìn)行分詞模糊查詢,但是數(shù)字不能分詞查詢。(經(jīng)過我的測試發(fā)現(xiàn))。
- 分頁從0開始(和SpringDataJPA的用法類似)。
到了這里,關(guān)于SpringBoot整合Elasticsearch實(shí)現(xiàn)分頁條件查詢及注意事項(xiàng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!