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

SpringBootElasticSearch实现模糊查询,批量CRUD,排序,分页

  一、导入elasticsearch依赖
  在pom.xml里加入如下依赖         org.springframework.boot       spring-boot-starter-data-elasticsearch 
  非常重要:检查依赖版本是否与你当前所用的版本是否一致,如果不一致,会连接失败!
  二、创建高级客户端import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Configuration public class ElasticSearchClientConfig {     @Bean     public RestHighLevelClient restHighLevelClient(){         RestHighLevelClient client = new RestHighLevelClient(                 RestClient.builder(                         new HttpHost("服务器IP", 9200, "http")));         return client;     } }三、基本用法1.创建、判断存在、删除索引import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;  import java.io.IOException;  @SpringBootTest class ElasticsearchApplicationTests {   @Autowired  private RestHighLevelClient restHighLevelClient;   @Test  void testCreateIndex() throws IOException {   //1.创建索引请求   CreateIndexRequest request = new CreateIndexRequest("ljx666");   //2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应   CreateIndexResponse response=     restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);   System.out.println(response);  }   @Test  void testExistIndex() throws IOException {         //1.查询索引请求   GetIndexRequest request=new GetIndexRequest("ljx666");         //2.执行exists方法判断是否存在   boolean exists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);   System.out.println(exists);  }   @Test  void testDeleteIndex() throws IOException {         //1.删除索引请求   DeleteIndexRequest request=new DeleteIndexRequest("ljx666");         //执行delete方法删除指定索引   AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);   System.out.println(delete.isAcknowledged());  }  }2.对文档的CRUD
  创建文档:
  注意:如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。
  创建文档时若该ID已存在,发送创建文档请求后会更新文档中的数据。 @Test void testAddUser() throws IOException {  //1.创建对象  User user=new User("Go",21,new String[]{"内卷","吃饭"});  //2.创建请求  IndexRequest request=new IndexRequest("ljx666");  //3.设置规则 PUT /ljx666/_doc/1  //设置文档id=6,设置超时=1s等,不设置会使用默认的  //同时支持链式编程如 request.id("6").timeout("1s");  request.id("6");  request.timeout("1s");   //4.将数据放入请求,要将对象转化为json格式     //XContentType.JSON,告诉它传的数据是JSON类型  request.source(JSONValue.toJSONString(user), XContentType.JSON);       //5.客户端发送请求,获取响应结果  IndexResponse indexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT);  System.out.println(indexResponse.toString());  System.out.println(indexResponse.status()); }
  获取文档中的数据: @Test void testGetUser() throws IOException {  //1.创建请求,指定索引、文档id  GetRequest request=new GetRequest("ljx666","1");  GetResponse getResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);     System.out.println(getResponse);//获取响应结果  //getResponse.getSource() 返回的是Map集合  System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串    }
  更新文档数据:
  注意:需要将User对象中的属性全部指定值,不然会被设置为空,如User只设置了名称,那么只有名称会被修改成功,其他会被修改为null。  @Test void testUpdateUser() throws IOException {  //1.创建请求,指定索引、文档id  UpdateRequest request=new UpdateRequest("ljx666","6");   User user =new User("GoGo",21,new String[]{"内卷","吃饭"});  //将创建的对象放入文档中  request.doc(JSONValue.toJSONString(user),XContentType.JSON);   UpdateResponse updateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);  System.out.println(updateResponse.status());//更新成功返回OK }
  删除文档: @Test void testDeleteUser() throws IOException {  //创建删除请求,指定要删除的索引与文档ID  DeleteRequest request=new DeleteRequest("ljx666","6");   DeleteResponse updateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);  System.out.println(updateResponse.status());//删除成功返回OK,没有找到返回NOT_FOUND }3.批量CRUD数据
  这里只列出了批量插入数据,其他与此类似
  注意:hasFailures()方法是返回是否失败,即它的值为false时说明上传成功  @Test void testBulkAddUser() throws IOException {  BulkRequest bulkRequest=new BulkRequest();  //设置超时  bulkRequest.timeout("10s");   ArrayList list=new ArrayList<>();  list.add(new User("Java",25,new String[]{"内卷"}));  list.add(new User("Go",18,new String[]{"内卷"}));  list.add(new User("C",30,new String[]{"内卷"}));  list.add(new User("C++",26,new String[]{"内卷"}));  list.add(new User("Python",20,new String[]{"内卷"}));   int id=1;  //批量处理请求  for (User u :list){   //不设置id会生成随机id   bulkRequest.add(new IndexRequest("ljx666")     .id(""+(id++))     .source(JSONValue.toJSONString(u),XContentType.JSON));  }   BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);  System.out.println(bulkResponse.hasFailures());//是否执行失败,false为执行成功 }4.查询所有、模糊查询、分页查询、排序、高亮显示@Test void testSearch() throws IOException {  SearchRequest searchRequest=new SearchRequest("ljx666");//里面可以放多个索引  SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();//构造搜索条件   //此处可以使用QueryBuilders工具类中的方法  //1.查询所有  sourceBuilder.query(QueryBuilders.matchAllQuery());  //2.查询name中含有Java的  sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name"));  //3.分页查询  sourceBuilder.from(0).size(5);       //4.按照score正序排列  //sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC));  //5.按照id倒序排列(score会失效返回NaN)  //sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));   //6.给指定字段加上指定高亮样式  HighlightBuilder highlightBuilder=new HighlightBuilder();  highlightBuilder.field("name").preTags("").postTags("");  sourceBuilder.highlighter(highlightBuilder);     searchRequest.source(sourceBuilder);  SearchResponse searchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);   //获取总条数  System.out.println(searchResponse.getHits().getTotalHits().value);  //输出结果数据(如果不设置返回条数,大于10条默认只返回10条)  SearchHit[] hits=searchResponse.getHits().getHits();  for(SearchHit hit :hits){   System.out.println("分数:"+hit.getScore());   Map source=hit.getSourceAsMap();   System.out.println("index->"+hit.getIndex());   System.out.println("id->"+hit.getId());   for(Map.Entry s:source.entrySet()){    System.out.println(s.getKey()+"--"+s.getValue());   }  } }四、总结1.大致流程
  创建对应的请求 --> 设置请求(添加规则,添加数据等) --> 执行对应的方法(传入请求,默认请求选项)–> 接收响应结果(执行方法返回值)–> 输出响应结果中需要的数据(source,status等) 2.注意事项如果不指定id,会自动生成一个随机id 正常情况下,不应该这样使用 new IndexRequest("ljx777") ,如果索引发生改变了,那么代码都需要修改,可以定义一个枚举类或者一个专门存放常量的类,将变量用final static 等进行修饰,并指定索引值。其他地方引用该常量即可,需要修改也只需修改该类即可。elasticsearch相关的东西,版本都必须一致,不然会报错 elasticsearch很消耗内存,建议在内存较大的服务器上运行elasticsearch,否则会因为内存不足导致elasticsearch自动killed

新疆博州夜空出现神秘巨大发光物体9月21号晚上10点左右,在新疆福海县天空出现不明飞行物,据悉,该不明飞行物发出巨大的白光,拖着长长的尾巴的感觉。从网友拍摄的神秘发光物体来看,这个物体非常巨大,光源也很亮,堪比演郭晶晶美得开了挂,伶俐短发配纱裙优雅高贵,比一般女星高级很多头条创作挑战赛高颜值和好身材是让外貌出众的绝对优势,拥有这两样优势的人,很容易就能从人群中脱颖而出。但是并不是人人都能拥有这样老天爷赏饭吃的幸运。但是这并不意味着身材长相不优越的人外星文明来了,科学家预测或将在2047年发现外星人!仅剩25年时间在宇宙中大约有2万亿个星系,银河系里大概有15004000亿颗恒星,太阳便是其中的一颗,所以说我们生活的地球就像是宇宙中的一粒尘埃,对宇宙而言太过渺小。我们甚至无法离开太阳系,我们她又被拍到了?与男星凌晨共处一室,粉丝直言要脱粉近日,有媒体又双叒叕拍到了陈都灵绯闻男友汪汐,深夜前往陈都灵住所,疑似恋情曝光。从视频来看,当晚汪汐潮先是和朋友在咖啡店门口聊天抽烟随后汪汐潮便去了陈都灵住处,直到凌晨1点都没有离什么时候买手机最划算?这4个时间点入手,不花一分冤枉钱手机售价会出现波动在行业内已不是什么新鲜事,特别是近几年来,有的手机一度出现跳水价,于是不少人都遇到过手机才入手没多久,手机就直降几百甚至上千的扎心事。其实手机厂商对于产品定价是有孙俪一袭长裙出席活动,大气优雅,好气质就该这样穿孙俪是演技实力派的演员,出演了很多经典又好看的影视作品,尤其是诠释大女主的角色,孙俪更是拿捏到位,所以,很多人都喜欢她。私下的孙俪是一个特别低调的女明星,不张扬不做作,认真对待每一女人最好看的衣服就是长裙2022年9月17日。这两年在网上买的衣服最多的就是裙子,今天想起来写这个题目,不得不引起回忆。我清楚地记得我穿第一条裙子的时候,是我妈给我买的绿底起花的连衣裙,是在王府井百货大楼有想法?马竞前锋女友晒出长裙露腿度假照片,内马尔积极点赞周中欧冠对阵以色列球队海法马卡比,内马尔帮助巴黎打进锁定胜局的进球。本赛季,巴西球星状态颇佳,新赛季刚开始就频频有进球和助攻。内少能够保持如此好的状态,或许和他恢复单身有关系,前不和李易峰传绯闻被杨颖怒撕,李菲儿为何总是爱情牺牲者?她是锁清秋中兰心蕙质的丫头苏心禾是鹿鼎记中温柔害羞的曾柔也是致我们终将到来的爱情中清纯文艺的梁爽但是在观众眼中,她身上最大的标签依旧是黄晓明的前女友,如今又多了一条李易峰的绯闻对象Angelababy中秋造型太惊艳,cos嫦娥仙气飘飘,轻纱长裙灵动飘逸每个人都在用不同的方式庆祝着中秋佳节,但是Angelababy的方式格外让人惊讶,因为她Cosplay了嫦娥,身穿一袭非常轻薄的纱质连衣裙,灵动飘逸的气质仙气飘飘,怀中抱着嫦娥的标陈萌朱单伟拍摄婚纱照,女方长裙上镶满珍珠,相互对视好甜蜜这几天,大衣哥新儿媳陈萌可谓相当活跃,多次在社交平台晒出与朱单伟的婚纱照。26日,陈萌直接开启了直播,并曝光了与朱单伟拍摄婚纱照的细节,引来了无数网友的围观。照片中,陈萌身穿白色珍
永登西路红军女战士陈桂香牟炳贞永登西路红军女战士陈桂香牟炳贞作者童僖2005年9月5日,前国家主席夫人林佳楣和西路军老战士原中国人民解放军空军副司令员王定烈,西路军史研究专家国防大学教授朱玉,以及部分西路军将士女儿度蜜月,许世友却发火3天回部队,不然开除军籍这是为何?在女儿许华山的眼中,父亲许世友是无私的,虽然他是我党的高级将领国家的高级干部,但是却一直保有与普通战士劳动人民之间的阶级感情,她说这也是他们那一代人的共性。许华山许世友一共有4个孩志愿军团长车祸受伤,不听师长劝阻,骑着骡子冒死上阵地作者九鱼亭在抗美援朝第四次战役中,为了东线战役的胜利,志愿军38军奉命在汉江南岸阻击数倍于己的敌军,和大量飞机坦克,335团所驻守的580高地成为敌我双方焦点,也是战事最激烈的高地罚罪临近结局怕剧荒?别急,4部重磅大剧待播,总有你的菜罚罪剧情越逼近结局,越过瘾。最新的剧情中,除了大王的真实身份由赵啸声亲口揭秘,他就是赵鹏超之外。赵家转移资产的大棋已经被警方掌握,赵家内斗加剧,这局棋越来越精彩了。而剧情一个巨大的天下第一!此生一定要去看看中国居然有这么多天下第一的风景,你去过哪几个,又知道哪几个呢?天下第一山泰山天下奇怪险第一山华山天下第一奇山黄山天下第一秀水千岛湖天下第一庙孔庙天下第一寺少林寺天下第一名刹白马寺天森林狼队到底是三巨头还是四巨头?拉塞尔地位越来越差了北京时间8月31日,今年休赛期,随着杜兰特留队,最大的交易无疑是森林狼队1换10交易得到戈贝尔了,事实上,即便是杜兰特被交易,也很难媲美戈贝尔的交易,森林狼队火力全开的得到戈贝尔,156万平方公里的外蒙古是怎么失去的?以后还能回来吗?很多军迷在看中国地图的时候,都不免要对着北方那一大片面积156万平方公里,差不多相当于东北三省面积的土地发出感慨,甚至愤愤不平外蒙,曾经是中国的土地,现在却是被世界各国普遍承认的独费迪南德马奎尔在曼联坐板凳,那他在英格兰队也有麻烦了在个人播客节目中,曼联名宿费迪南德谈到了马奎尔替补的影响。他表示,马奎尔如果在曼联踢不上球,那么他在英格兰队的位置也会受到很大的影响。关于马奎尔的表现费迪南德这样说道我认为马丁内斯世界最尊贵的皇族排面!伊丽莎白的灵车为奔驰定制款!亲王为路虎周日,英国女王伊丽莎白二世的灵柩被一辆专门为这项任务准备的黑色灵车运过苏格兰。这辆车是由WilliamPurveFuneralDirector服务提供的,该服务在车窗上看到它的名字英格兰足坛名场面一名主帅执教两支球队,同场比赛在足球比赛中,标配就是一名主教练执教一支球队。而在1952年的英格兰地区联赛里,却上演了从未有过的一幕。同一场比赛里的两支球队,他们的主教练均是一人。虽然仅有这一场比赛,但这位名叫让外国元首乘商业飞机坐集体大巴,英国女王葬礼要求引大使吐槽能想象拜登坐大巴吗?(观察者网讯)综合美国政客新闻网欧洲版(politico。eu),英国卫报独立报等多家外媒11日报道,他们获得了一份据称是英国外交部发给各国使馆的关于女王葬礼仪式的指导文件,其中包