0


Spring Boot整合分布式搜索引擎ElasticSearch 实现相关基本操作

在这里插入图片描述

文章目录

一、ElasticSearch 介绍

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

ElasticSearch 官网地址:https://www.elastic.co/cn/

image.png

二、环境准备

在开始开发之前,我们需要准备一些环境配置:

  • jdk 1.8 或其他更高版本
  • 开发工具 IDEA
  • 管理依赖 Maven
  • ElasticSearch环境,此处使用docker搭建,ElasticSearch 版本为7.17.7
  • Spring Boot 2.X

三、创建Spring Boot项目导入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

注意:依赖版本必须与你当前所用的版本保持一致,否则连接失败

image.png

image.png

四、创建高级客户端

新建config目录存放项目配置类

@ConfigurationpublicclassElasticSearchClientConfig{@BeanpublicRestHighLevelClientrestHighLevelClient(){RestHighLevelClient client =newRestHighLevelClient(RestClient.builder(newHttpHost("服务器IP地址",9200,"http")));return client;}}

五、基本操作

索引操作

@SpringBootTestclassDemoApplicationTests{@AutowiredprivateRestHighLevelClient restHighLevelClient;/**
    * 创建索引
    **/@TestvoidtestCreateIndex()throwsIOException{//1.创建索引请求CreateIndexRequest request =newCreateIndexRequest("lt");//2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应CreateIndexResponse response=
                restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);System.out.println(response);}/**
     * 判断索引是否存在
     **/@TestvoidtestExistIndex()throwsIOException{//1.查询索引请求GetIndexRequest request=newGetIndexRequest("lt");//2.执行exists方法判断是否存在boolean exists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);System.out.println(exists ?"存在":"消失");}/**
     * 删除索引
     **/@TestvoidtestDeleteIndex()throwsIOException{//1.删除索引请求DeleteIndexRequest request=newDeleteIndexRequest("lt");//执行delete方法删除指定索引AcknowledgedResponse delete = restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged()?"删除成功":"删除失败");}}

文档操作

创建实体类User

@Data@NoArgsConstructor@AllArgsConstructor@ToStringpublicclassUser{privateString name;privateInteger age;privateString[] funny;}

文档相关操作代码

/**
 * 创建文档
 **/@TestvoidtestAddUser()throwsIOException{//1.创建对象User user=newUser("小赵",21,newString[]{"篮球","吃饭"});//2.创建请求IndexRequest request=newIndexRequest("lt");//3.设置规则 PUT /lt/_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());}/**
 * 获取文档数据
 **/@TestvoidtestGetUser()throwsIOException{//1.创建请求,指定索引、文档idGetRequest request=newGetRequest("lt","1");GetResponse getResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);System.out.println(getResponse);//获取响应结果//getResponse.getSource() 返回的是Map集合System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串}/**
 * 更新文档
 **/@TestvoidtestUpdateUser()throwsIOException{//1.创建请求,指定索引、文档idUpdateRequest request=newUpdateRequest("lt","6");User user =newUser("xiaozhao",21,newString[]{"xxx","xxx"});//将创建的对象放入文档中
    request.doc(JSONValue.toJSONString(user),XContentType.JSON);UpdateResponse updateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);System.out.println(updateResponse.status());}/**
 * 删除文档
 **/@TestvoidtestDeleteUser()throwsIOException{//创建删除请求,指定要删除的索引与文档IDDeleteRequest request=newDeleteRequest("lt","6");DeleteResponse updateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);System.out.println(updateResponse.status());}

批量插入数据

/**
 * 批量插入数据
 **/@TestvoidtestBulkAddUser()throwsIOException{BulkRequest bulkRequest=newBulkRequest();//设置超时
    bulkRequest.timeout("10s");ArrayList<User> list=newArrayList<>();
    list.add(newUser("Java",25,newString[]{"内卷"}));
    list.add(newUser("Go",18,newString[]{"内卷"}));
    list.add(newUser("C",30,newString[]{"内卷"}));
    list.add(newUser("C++",26,newString[]{"内卷"}));
    list.add(newUser("Python",20,newString[]{"内卷"}));int id=1;//批量处理请求for(User u :list){//不设置id会生成随机id
        bulkRequest.add(newIndexRequest("ljx666").id(""+(id++)).source(JSONValue.toJSONString(u),XContentType.JSON));}BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);System.out.println(bulkResponse.hasFailures());//是否执行失败,false为执行成功}

其他操作

@TestvoidtestSearch()throwsIOException{SearchRequest searchRequest=newSearchRequest("ljx666");//里面可以放多个索引SearchSourceBuilder sourceBuilder=newSearchSourceBuilder();//构造搜索条件//此处可以使用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=newHighlightBuilder();
    highlightBuilder.field("name").preTags("<span style='color:red;'>").postTags("</span>");
    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<String,Object> source=hit.getSourceAsMap();System.out.println("index->"+hit.getIndex());System.out.println("id->"+hit.getId());for(Map.Entry<String,Object> s:source.entrySet()){System.out.println(s.getKey()+"--"+s.getValue());}}}

六、总结

  • 依赖版本必须与你当前所用的版本保持一致,否则连接失败。
  • 如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。
  • 创建文档时若该ID已存在,发送创建文档请求后会更新文档中的数据。
  • 更新文档时需要将实体对象中的属性全部指定值,不然会被设置为空,如果只设置了一个字段,那么只有该字段会被修改成功,其他会被修改为null。
  • hasFailures()方法是返回是否失败,即它的值为false时说明上传成功
  • elasticsearch很消耗内存,极力推荐使用docker部署运行

本文转载自: https://blog.csdn.net/Zp_insist/article/details/128358346
版权归原作者 百思不得小赵 所有, 如有侵权,请联系我们删除。

“Spring Boot整合分布式搜索引擎ElasticSearch 实现相关基本操作”的评论:

还没有评论