范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringBoot整合ElasticSearch实现增删改查基本示例

  Spring Boot整合ElasticSearch实现增删改查基本示例
  ElasticSearch被命名为大数据搜索引擎,在文件检索、数据存储方面具有天然的优势。而SpringBoot作为服务整合中间件,在服务组装方面是一款万能粘合器,本文主要提供Spring Boot整合ElasticSearch基本增删改示例。一、ElasticSearch安装
  ElasticSearch安装过程可参考博主之前笔文:
  https://www.toutiao.com/i6827758978567504392/二、ElasticSearch基本介绍
  ElasticSearch基本介绍可参考博主之前笔文:
  https://www.toutiao.com/i6884427730096488971/三、Spring Boot项目引入ElasticSearch坐标
  Maven工程引入:
  org.springframework.boot
  spring-boot-starter-data-elasticsearch
  
  注意:ElasticSearch版本号与Spring Boot版本号是有关联的,本文笔者Spring Boot版本号是2.1.6,因此安装的ElasticSearch版本号是7.7.0。四、声明ElasticSearch Model层工具
  package com.opendi.generator.elasticsearch.model;
  import lombok.Data;
  import org.springframework.data.annotation.Id;
  import org.springframework.data.elasticsearch.annotations.Document;
  import org.springframework.data.elasticsearch.annotations.Field;
  import org.springframework.data.elasticsearch.annotations.FieldType;
  import java.util.List;
  @Data
  @Document(indexName="post", type="post",shards=1,replicas = 0)
  public class Post {
  @Id
  private String id;
  private String title;
  @Field(type=FieldType.Nested)
  private List tags;
  }
  package com.opendi.generator.model;
  import lombok.Data;
  import org.springframework.data.annotation.Id;
  import org.springframework.data.elasticsearch.annotations.Document;
  import org.springframework.data.elasticsearch.annotations.Field;
  import org.springframework.data.elasticsearch.annotations.FieldType;
  @Data
  @Document(indexName = "book", type = "_doc", shards = 1, replicas = 0)
  public class BookBean {
  @Id
  private String id;
  @Field(type = FieldType.Keyword)
  private String title;
  @Field(type = FieldType.Keyword)
  private String author;
  @Field(type = FieldType.Keyword)
  private String postDate;
  public BookBean(){}
  public BookBean(String id, String title, String author, String postDate){
  this.id=id;
  this.title=title;
  this.author=author;
  this.postDate=postDate;
  }
  public String getId() {
  return id;
  }
  public void setId(String id) {
  this.id = id;
  }
  public String getTitle() {
  return title;
  }
  public void setTitle(String title) {
  this.title = title;
  }
  public String getAuthor() {
  return author;
  }
  public void setAuthor(String author) {
  this.author = author;
  }
  public String getPostDate() {
  return postDate;
  }
  public void setPostDate(String postDate) {
  this.postDate = postDate;
  }
  @Override
  public String toString() {
  return "BookBean{" +
  "id="" + id + """ +
  ", title="" + title + """ +
  ", author="" + author + """ +
  ", postDate="" + postDate + """ +
  "}";
  }
  }
  声明文档类为ElasticSearch类型的Document文档,字段Field类型也为ES里面的Field类型。五、声明ElasticSearch处理的DAO层工具
  package com.opendi.generator.elasticsearch.mapper;
  import com.opendi.generator.elasticsearch.model.Post;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  public interface PostRepository extends ElasticsearchRepository {
  Page findByTitle(String title, Pageable pageable);
  }
  package com.opendi.generator.dao;
  import com.opendi.generator.model.BookBean;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.Pageable;
  import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  /**
  * 接口关系:
  * ElasticsearchRepository --> ElasticsearchCrudRepository --> PagingAndSortingRepository --> CrudRepository
  */
  public interface BookRepository extends ElasticsearchRepository {
  //Optional findById(String id);
  Page findByAuthor(String author, Pageable pageable);
  Page findByTitle(String title, Pageable pageable);
  }
  使用了ElasticSearch里面的操作工具对数据进行操作。六、声明ElasticSearch里面的Service层
  声明Service层操作工具,来源于ElasticSearch工具类,自动进行增删改操作:
  package com.opendi.generator.elasticsearch.service;
  import com.opendi.generator.elasticsearch.model.Post;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.PageRequest;
  import java.util.Optional;
  public interface PostService {
  Post save(Post post);
  Optional findOne(String id);
  Iterable findAll();
  Page findByTitle(String title, PageRequest pageRequest);
  }
  指定操作对象:
  package com.opendi.generator.elasticsearch.service.impl;
  import com.opendi.generator.elasticsearch.mapper.PostRepository;
  import com.opendi.generator.elasticsearch.model.Post;
  import com.opendi.generator.elasticsearch.service.PostService;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.PageRequest;
  import org.springframework.stereotype.Service;
  import java.util.Optional;
  @Service
  public class PostServiceImpl implements PostService {
  @Autowired
  private PostRepository postRepository;
  @Override
  public Post save(Post post) {
  postRepository.save(post);
  return post;
  }
  @Override
  public Optional findOne(String id) {
  return postRepository.findById(id);
  }
  @Override
  public Iterable findAll() {
  return postRepository.findAll();
  }
  @Override
  public Page findByTitle(String title, PageRequest pageRequest) {
  return postRepository.findByTitle(title, pageRequest);
  }
  }
  package com.opendi.generator.service;
  import com.opendi.generator.model.BookBean;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.PageRequest;
  import java.util.List;
  import java.util.Optional;
  public interface BookService {
  Optional findById(String id);
  BookBean save(BookBean blog);
  void delete(BookBean blog);
  Optional findOne(String id);
  List findAll();
  Page findByAuthor(String author, PageRequest pageRequest);
  Page findByTitle(String title, PageRequest pageRequest);
  }
  package com.opendi.generator.service.impl;
  import com.opendi.generator.dao.BookRepository;
  import com.opendi.generator.model.BookBean;
  import com.opendi.generator.service.BookService;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Qualifier;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.PageRequest;
  import org.springframework.stereotype.Service;
  import java.util.List;
  import java.util.Optional;
  @Service("blogService")
  public class BookServiceImpl implements BookService {
  @Autowired
  @Qualifier("bookRepository")
  private BookRepository bookRepository;
  @Override
  public Optional findById(String id) {
  //CrudRepository中的方法
  return bookRepository.findById(id);
  }
  @Override
  public BookBean save(BookBean blog) {
  return bookRepository.save(blog);
  }
  @Override
  public void delete(BookBean blog) {
  bookRepository.delete(blog);
  }
  @Override
  public Optional findOne(String id) {
  return bookRepository.findById(id);
  }
  @Override
  public List findAll() {
  return (List) bookRepository.findAll();
  }
  @Override
  public Page findByAuthor(String author, PageRequest pageRequest) {
  return bookRepository.findByAuthor(author,pageRequest);
  }
  @Override
  public Page findByTitle(String title, PageRequest pageRequest) {
  return bookRepository.findByTitle(title,pageRequest);
  }
  }
  会调用ElasticSearch底层功能进行操作,能够实现ElasticSearch增删改操作。七、增加服务器配置
  连接服务器ElasticSearch连接配置:
  spring:
  data:
  elasticsearch:
  cluster-name: es2018
  cluster-nodes: 10.172.8.154:9300
  repositories:
  enabled: true
  elasticsearch:
  jest:
  uris: http:// 10.172.8.154:9200
  增加连接配置,这样就能连接ElasticSearch客户端了。八、ElasticSearch Controller层操作
  ElasticSearch在Controller操作:
  package com.opendi.generator.controller;
  import com.opendi.generator.model.BookBean;
  import com.opendi.generator.service.BookService;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.ResponseBody;
  import org.springframework.web.bind.annotation.RestController;
  import java.util.Optional;
  @RestController
  public class ElasticController {
  @Autowired
  private BookService bookService;
  @RequestMapping("/book/{id}")
  @ResponseBody
  public BookBean getBookById(@PathVariable String id){
  Optional opt =bookService.findById(id);
  BookBean book=opt.get();
  System.out.println(book);
  return book;
  }
  @RequestMapping("/save")
  @ResponseBody
  public void Save(){
  System.setProperty("es.set.netty.runtime.available.processors", "false");
  BookBean book=new BookBean("1","ES入门教程","程裕强","2018-10-01");
  System.out.println(book);
  bookService.save(book);
  }
  }
  package com.opendi.generator.elasticsearch.controller;
  import com.opendi.generator.elasticsearch.model.Post;
  import com.opendi.generator.elasticsearch.model.Tag;
  import com.opendi.generator.elasticsearch.service.PostService;
  import io.swagger.annotations.Api;
  import io.swagger.annotations.ApiOperation;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.data.domain.Page;
  import org.springframework.data.domain.PageRequest;
  import org.springframework.web.bind.annotation.GetMapping;
  import org.springframework.web.bind.annotation.RestController;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  @Api(tags="ElasticSearch示例")
  @RestController
  public class PostController {
  @Autowired
  private PostService postService;
  @ApiOperation(value="得到ES结果")
  @GetMapping(value="getList")
  public List> getList()
  {
  List> list = new ArrayList>();
  Tag tag = new Tag();
  tag.setId("1");
  tag.setName("tech");
  Tag tag2 = new Tag();
  tag2.setId("2");
  tag2.setName("elasticSearch");
  Post post = new Post();
  post.setId("1");
  post.setTitle("This is post");
  post.setTags(Arrays.asList(tag,tag2));
  postService.save(post);
  Post post2 = new Post();
  post2.setId("2");
  post2.setTitle("Biding2");
  post2.setTags(Arrays.asList(tag));
  postService.save(post2);
  Page posts = postService.findByTitle("This is post", new PageRequest(0, 10));
  Page posts2 = postService.findByTitle("Biding2", new PageRequest(0,10));
  Page posts3 = postService.findByTitle("Biding2", new PageRequest(0,10));
  list.add(posts);
  list.add(posts2);
  list.add(posts3);
  return list;
  }
  }九、运行效果
  控制台打印:

40倍提升,详解JuiceFS元数据备份恢复性能优化之路JuiceFS支持多种元数据存储引擎,且各引擎内部的数据管理格式各有不同。为了便于管理,JuiceFS自0。15。2版本提供了dump命令允许将所有元数据以统一格式写入到JSON文科比一人一城20年,他的数据在湖人队史有多恐怖?一人一城的故事,在这个时代已经成为了稀缺品。当今联盟坚持一人一城的球星不多了,库里比尔和利拉德都值得称道。再往前看,科比邓肯和诺维茨基更是传奇,其中科比效力的湖人队,是历史上最具人一道高频腾讯面试题tcp数据发送问题问题引出好几个读者私信说在腾讯面试过程中,被面试官问到了一个问题一个tcp服务端和一个tcp客户端,客户端和服务端建立连接后,服务端一直sleep,然后客户端一直发送数据会是什么现羊水穿刺,要做吗?它的风险也许没你想得大孕妇们对羊水穿刺有种种的疑问,整理成五个问题来解答1为什么要做羊水穿刺?羊水穿刺的是为了采集胎儿的细胞而做的进一步的遗传学诊断,羊水细胞它来源于羊膜,包含胎儿口腔尿路皮肤脱落细胞,独库公路浓缩了80新疆的美,真的是这样吗?广州的梁同学开着爱车带着岳父母和老婆孩子跑了趟独库公路。昨晚住库车,今早5点出发,夜幕降临时到了乌鲁木齐,八千里路云和月。估计已闻厌了一路上的羊膻味,我特地预订了潮汕牛肉丸火锅来给新疆旅行的最大弊端南方人因此吃大亏!这些景点你根本没玩明白文中图片cr新疆国旅近日实拍谁来新疆之前都在纠结到底是自驾还是报团?举起你们的双手,让我看看!让我看看是哪些游客朋友们一直都在被自驾新疆的攻略洗脑。之所以说自驾新疆是一种洗脑,不为荷花开啦,这六大赏花地一定要去!坐船水上观荷,还有罕见并蒂莲荷花,是夏天的标志。从刚入夏开始,小爱就一直等着荷花开。这两天,荷花终于开啦!小爱赶紧搜罗了一圈今年可以赏荷的好地儿,别说,今年能赏荷的地方还真不少,而且,荷花也开得甚为美艳!更为赵露思粉色礼服,时尚穿搭赵露思穿粉色礼服高清图爱慕比心粉红色抹胸礼服让赵思露颈部优美的线条和迷人锁骨我想静静舔屏得到完美展示来看我飞吻在粉红色礼服的映衬下更显皮肤白里透红心心好看迷人给你小心心给你小心心搭加尔蒂埃希望内马尔留队,我知道怎么让他踢得最舒服虎扑07月16日讯不久前,巴黎新任主帅加尔蒂埃接受了RMC的采访。他表示,自己希望内马尔能够留队,并且知道怎样让他踢得最舒服。目前,30岁内马尔与巴黎的合同还有很长时间,它将在20晨起一杯温开水,等于喝细菌?医生给你答案,请转告家人水是人体中重要组成部分,若身体处于极度缺水状态下,会给健康带来危害。人可以七天不吃饭,但无法做到三天不喝水,由此可见,水是生命之源,并非空穴来风。现在各种养生方式层出不穷,其实每天抬头,河北的星空正在上演仲夏夜之梦!头条带你乐享河北我是大美河北推荐官微游河北河北文旅看图识景城市里的夜晚喧嚣热闹,灯火辉煌工业之光点亮了每一个人的夜晚但当你安静下来你又有多久没有仰望星空了?那条银河里是不是也藏着你
宇宙信使的中微子穿越地球南极冰立方天文台取得了对神秘中微子探索的进展,中微子是人类的陌生朋友,它们每时每刻穿越了人的身体和前方的一切物体,人们却浑然不知,中微子行进的路途或近或远,从最遥远太空的天涯海角到哲学家的疑惑粒子不断细分下去,到底有没有一个尽头?德国古典哲学家康德在纯粹理性批判中系统提出二律背反的现象,这是经验论和唯理论长期争执不下的四种命题。每一个命题都有两个对立且符合形式逻辑的解释。这种正反命题都合理且又对立的现象就叫子长市深藏丝路的钟山石窟钟山石窟,位于陕西省子长市,整个石窟依山而建,坐北向南。东接清风明月戏楼,南临秀延河,西眺安定故城,为中国丝绸之路北线必经之道。1988年,被国务院公布为全国重点文物保护单位。钟山魔兽手游正式公布!魔兽弧光大作战,老玩家沉默了暴雪出品,必属精品!这是很多年来的游戏老玩家,对暴雪公司游戏产品的一种肯定。魔兽世界暗黑破坏神星际争霸守望先锋等等游戏都成了一个个经典的符号。今年年初,暴雪宣布了将推出以魔兽世界为NASA向宇宙发射人类信息,科学家乱成一团,担心2014年猜想成真随着人类进入科技时代,对宇宙的探索越来越广。随着航天工程的重要性愈发凸显,人类对宇宙的懵懂好奇心,发展为对科研的自觉性。可见研究宇宙已经成为每个国家的使命,毕竟这涉及到人类从何而来CBA广东三消息,赵锦洋携女友出游,外援去向未定,徐杰投入训练CBA已进入五个月的休赛期,但是对于多名国字号球员来说还将有两大赛事等着他们,分别是世预赛以及亚洲杯,做为主教练杜锋一刻也不能停歇,五月中旬又将重新集结备战,为国争光是小伙子们义不最后五分钟还原库里莫兰特神仙打架时刻莫兰特一战封神,狂砍47分8篮板8助攻3抢断,刷新自己季后赛的得分记录,末节独砍18分且包揽全队最后15分,带队106101扳平系列赛比分。莫兰特包揽全队最后15分库里最后时刻连续中医穴位小妙招脑户穴头痛感即刻减轻督脉脑户一取穴步骤第一步沿后正中线从后发际线向下寻,第一个凸起即为第2颈椎棘突,其棘突下凹陷处即为哑门穴第二步在枕部可摸到一骨性隆起为枕外隆凸第三步从项后发际正中向上推至枕骨而止,27中11!25中9!连现役第一人都被绿军锁死,请别再说KD打得烂了凭借全队共同的努力,绿衫军在半决赛第二战中狂虐卫冕冠军雄鹿队,在本场比赛绿军开场就给雄鹿一个下马威,打出了一波183的梦幻开局,半场就将分差拉到了20分以上,虽然下半场雄鹿队展开顽常规赛被交易,季后赛被弃用!怀念杜兰特和威少,你还不如去勇士前言NBA季后赛正在如火如荼地进行中,如此高强度的比赛自然少不了伤病的困扰,作为一名运动员,一旦被伤病侵袭,极有可能走向了职业生涯的下坡路,被伤病摧毁的球星数不胜数,可伤病又是竞技场均23分6助,5年1。77亿美元?库里接班人找到,只有勇士敢这样做NBA分区半决赛打响,勇士和灰熊G1较量中,1分险胜。比赛最后时刻的戏剧程度,比不上普尔带给球迷的惊艳程度,刚刚进入联盟第三年,今年算是正式进入轮转,还不到23岁,普尔就已经可以扛