Springboot整合ElasticSearch
本篇介绍使用springboot 2.5.7 版本。
<parent>
<artifactId>spring-boot-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.7</version>
</parent>
springboot整合es需要使用spring-boot-starter-data-elasticsearch组件,这里使用的版本和spring-boot-parent版本保持一致。如果版本过低,可能没有Esclient,需要手动创建一个client使用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
在yml文件中进行配置,指定es服务器地址
spring:
elasticsearch:
rest:
uris: http://localhost:9200
如果版本过低,这里可能没有rest,低版本默认使用的是jest。这里是为了创建当然也可以通过代码的方式进行配置。
创建索引库:
@Data
@Document(indexName = "log_index")
public class LogEntity {
@Id
private String id;
@Field(type = FieldType.Date, format = DateFormat.none, pattern = {"yyyy-MM-dd HH:mm:ss"})
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@Field(type = FieldType.Keyword)
private String level;
}
- @Document:表示当前实体类为一个文档,就是一个索引库
- @Id:表示索引ID
- @Field:mapping属性,可以参考官方文档。比如type,analyzer,index等等。format是在type为data时,需要指定的日期格式。如果设置为了none,表示自定义格式。列如yyyy-MM-dd HH:mm:ss
创建一个ElasticsearchRepository仓库,提供es操作api。
@Component
public interface LogEntityRepository extends ElasticsearchRepository<LogEntity, String> {
}
在业务模块使用ElasticsearchRepository。
@Service
public class LogServiceImpl implements LogService {
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
LogEntityRepository logRepository;
@Override
public String insertIndex() {
LogEntity entity = new LogEntity();
entity.setLevel("2");
entity.setCreateTime(LocalDateTime.now());
LogEntity save = logRepository.save(entity);
return save.getId();
}
@Override
public String queryIndex() {
// 创建范围的开始和结束日期
LocalDateTime startDate = LocalDateTime.of(2024, 4, 1,0,0,0);
LocalDateTime endDate = startDate.plusMonths(1).minusDays(1); // 下个月的第1天减1天,即本月的最后一天
DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startDate_ = startDate.format(formatter);
String endDate_ = endDate.format(formatter);
// 创建范围查询
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("createTime")
.gte(startDate_) // 大于等于本月第一天
.lte(endDate_); // 小于等于本月最后一天
// 创建NativeSearchQueryBuilder并添加查询
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withQuery(rangeQueryBuilder);
// 构建并执行查询
NativeSearchQuery searchQuery = searchQueryBuilder.build();
SearchHits<LogEntity> searchHits = elasticsearchTemplate.search(searchQuery, LogEntity.class);
return JSON.toJSONString(searchHits);
}
}
代码中private ElasticsearchRestTemplate elasticsearchTemplate;组件中已经自动注入了bean,可以直接使用。因为LogEntityRepository中提供的api有限,有些功能需要使用ElasticsearchRestTemplate来拓展,比如代码中范围查询。
个人记录学习