[笔记]SpringBoot集成Elasticsearch7.6


这里不赘述Elasticsearch的相关基础知识点和部署教程,着重讲如何在SpringBoot框架中集成Elasticsearch

Spring Data项目中提供了操作es的框架Spring Data Elasticsearch,目前框架最新版本为4.0,根据Spring Data Elasticsearch的官方文档描述,4.0版本的框架支持Elasticsearch版本最新为7.6,所以如果用了更新版本的Elasticsearch的话不建议使用Spring Data Elasticsearch集成,可能会出现问题

个人在学习Elasticsearch过程中,发现网上SpringBoot集成es操作的相关博客资料不是很多,大多数版本仍在使用TransportClientTransportClientSpring Data Elasticsearch 4.0官方文档中已写明不推荐使用,且普遍都比较简略。Elasticsearch的版本迭代是很快的,所以建议大家在学习一些比较新的技术或框架的时候,最好是配合官方文档进行资料查阅,有时能够避免很多弯路

 

下面开始介绍如何在SpringBoot中集成


 

1、创建SpringBoot项目,引入Spring Data Elasticsearch依赖,目前默认版本是4.0

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、配置文件

spring:
  application:
    name: es-demo
  elasticsearch:
    rest:
      uris: http://localhost:9200  #es服务器地址(默认)

server:
  port: 8080

3、创建一个Book类,相当于Elasticsearch中的文档,用于演示

@Document(indexName = "book")
public class Book {

    //@Id注解表明该字段是文档id
    @Id
    private Integer id;

    private String title;

    private BigDecimal price;

    @Field(type = FieldType.Keyword)
    private List<String> tag;

    //此处省略getter、setter、toString...
}

现在项目已构建并配置完成,接着就可以使用Spring Data Elasticsearch框架提供的各种类进行操作了

 

 

用法一:基于JPA Repository的方式,继承ElasticsearchRepository接口后,方法名按照框架要求的命名规则,就能创建各种各样的条件查询,适合一些比较简单的查询操作,更详细的可以参考官方文档

1、创建用于Book对象的增删改查接口

@Repository
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {

    //findById()和save()之类的方法父接口已经写了,这里无需重复编写

    //按价格区间查询
    List<Book> findByPriceBetween(BigDecimal min, BigDecimal max);

    //按书名查询,因为使用了中文分词器ik,所以这里并不是精确查询
    List<Book> findByTitle(String title);

    //按标签匹配查询
    List<Book> findByTagIn(List<String> tags);
}

接口写好后,使用@Autowired注解自动注入即可使用,具体测试这里不赘述

 

 

用法二:使用ElasticsearchRestTemplate类操作,除了支持简单数据增删改查之外,还支持对索引进行操作;配合查询条件/聚合构造器NavtiveQueryBuilder、QueryBuilders、AggregationBuilders,可以进行一些复杂的查询和聚合操作,但需要对Elasticsearch的Query DSL比较熟悉

@SpringBootTest
public class EsRestTemplateTest {

    //自动注入即可使用
    @Autowired
    private ElasticsearchRestTemplate esRestTemplate;

    //按id查询
    @Test
    void testQueryBookById() {
        Book book = esRestTemplate.get("1", Book.class);
        Assertions.assertNotNull(book);
        System.out.println(book.toString());
    }

    //按书名查询
    @Test
    void testQueryBookByTitle() {
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery("title", "Java"))
                .build();
        SearchHits<Book> searchHits = esRestTemplate.search(searchQuery, Book.class);
        //SearchHits就是查询的结果集
        searchHits.get().forEach(hit -> {
            System.out.println(hit.getContent());
        });
    }

    //聚合操作-计算所有书籍的平均价格
    @Test
    void testAggregationBookAvgPrice() {
        //聚合名为avg_price,对price字段进行聚合,计算平均值
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .addAggregation(AggregationBuilders.avg("avg_price").field("price"))
                .build();
        SearchHits<Book> searchHits = esRestTemplate.search(searchQuery, Book.class);
        searchHits.get().forEach(hit -> {
            System.out.println(hit.getContent());
        });
        //获取聚合结果
        if (searchHits.hasAggregations()) {
            ParsedAvg parsedAvg = searchHits.getAggregations().get("avg_price");
            Assertions.assertNotNull(parsedAvg, "无聚合结果");
            System.out.println(parsedAvg.getValue());
        }
    }

//...... }

以上是ElasticsearchRestTemlpate类的简单用法,其他用法可以自行探索,构造器的方法名都和Elasticsearch的Query DSL基本一致,所以如果对Query DSL比较熟悉的话,用起来也不会很难

 

 

demo项目代码:https://github.com/ahrenJ/springboot-es


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM