Springboot整合ElasticSearch

642 阅读2分钟

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来拓展,比如代码中范围查询。

个人记录学习