文章目录
一、ElasticSearch 介绍
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
ElasticSearch 官网地址:https://www.elastic.co/cn/
二、环境准备
在开始开发之前,我们需要准备一些环境配置:
- 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>
注意:依赖版本必须与你当前所用的版本保持一致,否则连接失败
四、创建高级客户端
新建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部署运行
版权归原作者 百思不得小赵 所有, 如有侵权,请联系我们删除。