前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch

ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch

作者头像
张申傲
发布2020-09-03 10:43:01
1.5K0
发布2020-09-03 10:43:01
举报
文章被收录于专栏:漫漫架构路漫漫架构路

ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch

本节主要介绍SpringBoot与ElasticSearch的整合,并实现简单的CRUD。

  1. 概述 SpringBoot与ElasticSearch的整合主要有两种方式:
    1. Spring将ElasticSearch的操作也封装到了Spring Data项目中,dao接口继承 ElasticsearchRepository 即可;
    2. 使用Spring提供的ElasticsearchTemplate模板类,在Service类中直接注入ElasticsearchTemplate对象即可。
  2. 具体操作
    1. 引入spring-boot-starter-data-elasticsearch依赖
代码语言:javascript
复制
<!--ElasticSearch依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
代码语言:javascript
复制
spring:
data:
  elasticsearch:
    cluster-name: elasticsearch     #集群名称,默认即为 elasticsearch
    cluster-nodes: 127.0.0.1:9300 #配置es节点信息,多个节点用逗号分隔。如果没有指定,则启动ClientNode。注:ES中API的端口号要写TransportService服务的端口,默认为9300
代码语言:javascript
复制
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:29
* @Description:Book实体
* 加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词
*/
@Document(indexName = "product", type = "book")
@Getter
@Setter
public class Book {
  @Id
  String id;
  String name;
  String message;
  String type;
}
代码语言:javascript
复制
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:32
* @Description:Book Dao接口,继承ElasticsearchRepository实现EalsticSearch操作
*/
public interface BookDao extends ElasticsearchRepository<Book,String> {
}
代码语言:javascript
复制
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:36
* @Description:直接使用ElasticsearchRepository操作ElasticSearch
*/
@RestController
@RequestMapping("/book")
public class BookController {
  @Autowired
  private BookDao bookDao;

  /**
   * 根据id查询
   */
  @GetMapping("/get/{id}")
  public BookEntity getBookById(@PathVariable String id) {
      return bookDao.findOne(id);
  }

  /**
   * 全文检索
   */
  @GetMapping("/select/{search}")
  public List<BookEntity> search(@PathVariable String search) {
      QueryStringQueryBuilder builder = new QueryStringQueryBuilder(search);
      Iterable<BookEntity> searchResult = bookDao.search(builder);
      if (searchResult == null){
          return Collections.emptyList();
      }
      Iterator<BookEntity> iterator = searchResult.iterator();
      List<BookEntity> books = new ArrayList<>();
      while (iterator.hasNext()) {
          books.add(iterator.next());
      }
      return books;
  }

  /**
   * 分页查询
   */
  @GetMapping("/{page}/{size}/{search}")
  public List<BookEntity> searchByPage(@PathVariable Integer page, @PathVariable Integer size, @PathVariable String search) {

      // 分页参数
      Pageable pageable = new PageRequest(page, size);

      // 分数,并自动按分排序
      FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
              .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", search)),
                      ScoreFunctionBuilders.weightFactorFunction(1000)) // 权重:name 1000分
              .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("message", search)),
                      ScoreFunctionBuilders.weightFactorFunction(100)); // 权重:message 100分

      // 分数、分页
      SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable)
              .withQuery(functionScoreQueryBuilder).build();

      Page<BookEntity> searchPageResults = bookDao.search(searchQuery);
      return searchPageResults.getContent();

  }

  /**
   * 添加
   */
  @PostMapping("/insert")
  public BookEntity insertBook(BookEntity bookEntity) {
      bookDao.save(bookEntity);
      return bookEntity;
  }

  /**
   * 删除
   */
  @DeleteMapping("/delete/{id}")
  public BookEntity deleteById(@PathVariable String id) {
      BookEntity bookEntity = bookDao.findOne(id);
      bookDao.delete(id);
      return bookEntity;
  }

  /**
   * 修改
   * @param bookEntity
   * @return
   */
  @PutMapping("/update")
  public BookEntity updateBook(BookEntity bookEntity) {
      bookDao.save(bookEntity);
      return bookEntity;
  }
代码语言:javascript
复制
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:46
* @Description:使用ElasticsearchTemplate模板类操作ElasticSearch
*/
@RestController
@RequestMapping("/book/template")
public class BookControllerWithTemplate {
  @Autowired
  ElasticsearchTemplate elasticsearchTemplate;

  /**
   * 查询所有
   */
  @GetMapping("/find_all")
  public List<Map<String, Object>> findAll() {
      Client client = elasticsearchTemplate.getClient();

      SearchRequestBuilder srb = client.prepareSearch("product").setTypes("book");
      SearchResponse sr = srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
      SearchHits hits = sr.getHits();
      List<Map<String, Object>> datas = new ArrayList<>();
      for (SearchHit hit : hits) {
          Map<String, Object> source = hit.getSource();
          datas.add(source);
          System.out.println(hit.getSourceAsString());
      }
      return datas;
  }
}
  1. 总结 综上,可以看到,使用Spring Data框架或者ElasticsearchTemplate可以十分方便的操作ElasticSearch,简化了原生Restful API的复杂性。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档