1.在SpringBoot中添加jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
</dependency>
2.继承ElasticsearchRepository
@Repository
public interface EsDao extends ElasticsearchRepository<Logs, String> {
}
3.分页查询语句示例
public Page<Logs> selectAll(int pageSize,int pageNumber,Logs logs) {
NativeSearchQueryBuilder nativeSearch = new NativeSearchQueryBuilder();
//创建Java查询 Api
BoolQueryBuilder builder = QueryBuilders.boolQuery();
//创建filter,使用filter将所有条件串联起来
List<QueryBuilder> filter = builder.filter();
if(logs != null && !StringUtils.isEmpty(logs.getAppname())) {
//获取服务名称
/**
* 注:matchQuery:精确匹配
*/
filter.add(QueryBuilders.matchQuery("appname", logs.getAppname()));
}
if(logs != null && !StringUtils.isEmpty(logs.getCreateTime())) {
//获取日期时间
String time = logs.getCreateTime();
String startTime = time.split(" - ")[0];
String endTime = time.split(" - ")[1];
/**
* 注:rangeQuery:范围匹配
*/
filter.add(QueryBuilders.rangeQuery("@timestamp").gte(startTime).lte(endTime));
}
if(logs != null && !StringUtils.isEmpty(logs.getLevel())) {
String [] level = logs.getLevel().split(",");
List<String> levels = Arrays.asList(level);
/**
* 注:termsQuery:第一个参数是字段名称,第二个参数是匹配的参数,一个字段匹配多个值(相当于或),字段后必须加keyword不然查不到数据
*/
filter.add(QueryBuilders.termsQuery("level.keyword", levels));
}
/**
* 注:将查询条件放入nativeSearch中
*/
nativeSearch.withQuery(builder);
--pageNumber;//SpringDataJpa是从0开始的,这个很奇怪,搞了我半天
/**
* 注:termsQuery:字段排序
*/
nativeSearch.withSort(new FieldSortBuilder("@timestamp").order(SortOrder.DESC));
/**
* 注:termsQuery:分页
*/
nativeSearch.withPageable(PageRequest.of(pageNumber, pageSize));
/**
* 注:termsQuery:查询
*/
Page<Logs> search = this.esDao.search(nativeSearch.build());
return search;
}
网上好多只有API,没有具体的拼接方案,java查询Elasticsearch的方式有4种,这个是其中一种,如果有机会把其他几种也做个案例,如果有不明白的欢迎大家一起讨论!