当前位置: 首页 > 后端技术 > Java

SpringBoot+ElasticSearch实现模糊查询、批量CRUD、排序、分页、高亮!

时间:2023-04-02 09:54:24 Java

1.导入elasticsearch依赖在pom.xml中添加如下依赖>复制代码很重要:检查依赖版本是否和你当前使用的版本一致,不一致会连接失败!2.创建高级客户端。返回客户;}}复制代码三、基本用法1、创建、判断存在、删除索引importorg.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;importorg.elasticsearch.action.support.master.AcknowledgedResponse;导入org.elasticsearch.client.RequestOptions;导入org.elasticsearch.client.RestHighLevelClient;导入org.elasticsearch.client.indices.CreateIndexRequest;导入org.elasticsearch.client.indices。CreateIndexResponse;导入org.elasticsearch.client.indices.GetIndexRequest;导入org.junit.jupiter.api.Test;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.boot.test.context.SpringBootTest;importjava.io.IOException;@SpringBootTestclassElasticsearchApplicationTests{@AutowiredprivateRestHighLevelClientrestHighLevelClient;@TestvoidtestCreateIndex()throwsIOException{//1.创建请求请求CreateIndexRequestrequest=newCreateIndexRequest("ljx666");//2.客户端执行请求IndicesClient,执行create方法创建查询,请求后获得响应CreateIndexResponseresponse=restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);System.out.println(响应);}@TestvoidtestExistIndex()抛出IOException{//1。查询索引请求GetIndexRequestrequest=newGetIndexRequest("ljx666");//2。执行exists方法判断是否存在booleanexists=restHighLevelClient.indices().exists(request,Request.DEpFA);System.out.println(存在);}@TestvoidtestDeleteIndex()抛出IOException{//1。删除索引请求DeleteIndexRequestrequest=newDeleteIndexRequest("ljx666");//执行delete方法删除指定索引edAcknowledgrestHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}}复制代码2.为文档的增删改查创建一个文档:注意:如果添加的时候没有指定文档ID,他会随机生成一个ID。如果唯一创建文档时ID已存在,则在发送文档创建请求后更新文档中的数据。@TestvoidtestAddUser()抛出IOException{//1.创建对象Useruser=newUser("Go",21,newString[]{"involute","eat"});//2。创建请求IndexRequestrequest=newIndexRequest("ljx666");//3。设置规则PUT/ljx666/_doc/1//设置文档id=6,设置timeout=1s等,不设置则使用默认//同时支持链式编程如request.id("6").timeout("1s");request.id("6");request.timeout("1s");//4。将数据放入request,并将对象转成json格式//XContentType.JSON,告诉它传递的数据是JSON类型request.source(JSONValue.toJSONString(user),XContentType.JSON);//5。客户端发送请求并得到响应结果IndexResponseindexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT);System.out.println(indexResponse.toString());System.out.println(indexResponse.status());}复制代码获取文档中的数据:@TestvoidtestGetUser()throwsIOException{//1.创建请求,指定索引,文档idGetRequestrequest=newGetRequest("ljx666","1");GetResponsegetResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);System.out.println(getResponse);//获取响应结果//getResponse.getSource()返回Map集合System.out.println(getResponse.getSourceeAsString());//获取响应结果源中的内容并转换为字符串设置为空,如Useronlysetname,则只有name修改成功,其他修改为null@TestvoidtestUpdateUser()抛出IOException{//1.创建请求,指定索引,文档idUpdateRequestrequest=newUpdateRequest("ljx666","6");Useruser=newUser("GoGo",21,newString[]{"内卷","Dining"});//将创建的对象放到文档中request.doc(JSONValue.toJSONString(user),XContentType.JSON);UpdateResponseupdateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);System.out.println(updateResponse.status());//更新返回OK}复制代码删除文档:@TestvoidtestDeleteUser()throwsIOException{//创建删除请求,指定要删除的索引和文档IDDeleteRequestrequest=newDeleteRequest("ljx666","6");DeleteResponseupdateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);System.out.println(updateResponse.status());//删除成功返回OK,没有查找返回NOT_FOUND}复制代码3.批量CRUD数据这里只列出批量插入数据,其他与此类似注:hasFailures()方法返回是否失败,即当其值为false时,表示上传成功@TestvoidtestBulkAddUser()throwsIOException{BulkRequestbulkRequest=newBulkRequest();//设置超时bulkRequest.timeout("10s");ArrayListlist=newArrayList<>();list.add(newUser("Java",25,newString[]{"InnerScroll"}));list.add(newUser("Go",18,newString[]{"InnerScroll"}));列表。add(newUser("C",30,newString[]{"InnerScroll"}));list.add(newUser("C++",26,newString[]{"InnerScroll"}));list.add(newUser("Python",20,newString[]{"innervolume"}));intid=1;//批量处理requestsfor(Useru:list){//不设置id会生成随机idbulkRequest.add(newIndexRequest("ljx666").id(""+(id++)).source(JSONValue.toJSONString(u),XContentType.JSON));}BulkResponsebulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);System.out.println(bulkResponse.hasFailures());//是否执行失败,false表示执行成功}复制代码4.查询全部,模糊查询,分页查询,排序,高亮@TestvoidtestSearch()throwsIOException{SearchRequestsearchRequest=newSearchRequest("ljx666");//SearchSourceBuilder里面可以放多个索引sourceBuilder=newSearchSourceBuilder();//构造搜索条件//这里可以使用QueryBuilders工具类中的方法//1.查询所有sourceBuilder.query(QueryBuilders.matchAllQuery());//2。查询sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name"));//3。分页查询sourceBuilder.from(0).size(5);//4。按分数正序排列//sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC));//5。按id倒序排列(score会失败返回NaN)//sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));//6。给指定字段添加指定高亮样式HighlightBuilderhighlightBuilder=newHighlightBuilder();highlightBuilder.field("name").preTags("").postTags("");sourceBuilder.highlighter(highlightBuilder);searchRequest.source(sourceBuilder);SearchResponsesearchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);//获取总命中数System.out.println(searchResponse.getHits().getTotalHits().value);//输出结果数据(如果没有设置返回条数,超过10条默认只返回10条)SearchHit[]hits=searchResponse.getHits().getHits();for(SearchHithit:hits){System.out.println("Score:"+hit.getScore());Mapsource=hit.getSourceAsMap();System.out.println("index->??"+hit.getIndex());System.out.println("id->"+hit.getId());for(Map.Entrys:source.entrySet()){System.out.println(s.getKey()+"--"+s.getValue());}}}复制代码4.总结1.大体流程创建对应的请求-->设置请求(添加规则,添加数据等)-->执行对应的方法(传入请求,默认请求选项)-->>接收响应结果(执行方法返回值)-->输出响应结果中需要的数据(来源,状态等)2.注意事项如果不指定id,会自动生成一个随机id。一般情况下,你不应该这样使用newIndexRequest("ljx777")。如果索引发生变化,则需要修改代码。可以定义一个枚举类或者一个存储常量的类,用finalstatic等修饰变量,指定索引值在别处引用该常量。如果需要修改,只需要修改类即可。elasticsearch相关的东西,版本一定要一致,否则会报错。Elasticsearch消耗大量内存。建议在内存大的服务器上运行elasticsearch,否则elasticsearch会因为内存不足而被自动kill掉。

最新推荐
猜你喜欢