SpringBoot 中已经 通过 spring-boot-starter-data-elasticsearch 集成 ES 相关依赖,只需要通过 API 进行调用即可
1、基础环境
1.1、Maven
pom.xml
<!-- springboot 版本说明 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/></parent><!-- 依赖版本说明--><properties><java.version>1.8</java.version><fastJson.version>1.2.79</fastJson.version></properties><!-- 相关依赖 --><dependencies><!-- es 相关依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!-- json --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastJson.version}</version></dependency><!-- lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 常规基础依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>
1.2、 config类
需要声明绑定的 es 服务端信息,也可以通过 application.yaml 配置,推荐是试用配配置类的方式,也是官方推荐的方式。
方法一:编写配置类
后续对于 ES 操作的客户端主要用的就是这个配置类声明的 RestHighLevelClient
@Configurationpublic class ElasticSearchClientConfig {/*** 服务端 ip 端口绑定** @return*/@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(// 可以绑定多个地址,多个端口// new HttpHost("localhost", 9201, "http"),new HttpHost("localhost", 9200, "http")));return client;}}
方法二:编写配置文件
spring:elasticsearch:uris:- 127.0.0.1:9200
2、索引操作
编写测试类 IndicesTest 用于测试索引的基本操作
@SpringBootTestpublic class IndicesTest {@Autowiredprivate RestHighLevelClient restHighLevelClient;//索引名public static String INDICES_01 = "test";}
2.1、增加 - CreateIndexRequest
@Testpublic void createIndices() throws IOException {//1.声明索引 INDICES_01 即为索引名称CreateIndexRequest indexRequest = new CreateIndexRequest(INDICES_01);//2.执行,并获得响应CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(indexRequest, RequestOptions.DEFAULT);System.out.println(createIndexResponse);}
2.2、删除 - DeleteIndexRequest
//删除@Testpublic void delIndices() throws IOException {//1.声明索引DeleteIndexRequest indexRequest = new DeleteIndexRequest(INDICES_01);//2.执行,并返回响应AcknowledgedResponse response = restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);//3.打印响应System.out.println(response);}
2.3、查询 - GetIndexRequest
//查询@Testpublic void getIndices() throws IOException {//声明GetIndexRequest indexRequest = new GetIndexRequest(INDICES_01);//执行GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(indexRequest, RequestOptions.DEFAULT);//打印 testArrays.stream(getIndexResponse.getIndices()).forEach(System.out::println);}
3、文档(数据)操作
此处的文档操作其实和 MySQL 中 对于数据的操作类型,在 Java 中最大的差异就是可以面向对象进行操作。
创建自定义测试实体类 User,后续文档操作其实就是对于 User 对象的操作
@Data@NoArgsConstructor@AllArgsConstructorpublic class User {private Long id;private String name;private Integer age;}
3.1、增加 - IndexRequest
@Testpublic void addData() throws IOException {//对象声明,User user = new User(4l, "zhangsan2", 15);//数据连接IndexRequest indexRequest = new IndexRequest(IndicesTest.INDICES_01);//也可以设置超时时长//indexRequest.timeout("10s");indexRequest.id(user.getId().toString());//设置文档Id ,如果不设置,会随机生成indexRequest.source(JSON.toJSONString(user), XContentType.JSON);//执行IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);//打印执行状态System.out.println(response.status());}
3.2、简单查询 - SearchRequest
此处示例只是简单的 match 查询,具体各种filter,term 等查询可根据上一章调用的 API 进行适当修改即可
@Testpublic void searchData() throws IOException {SearchRequest searchRequest = new SearchRequest(IndicesTest.INDICES_01);//SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//设置查询条件// searchSourceBuilder.query(QueryBuilders.matchAllQuery());//不使用字段查询,查询全部// searchSourceBuilder.query(QueryBuilders.termQuery("name","zhangsan"));//不使用分词器,精确匹配// searchSourceBuilder.query(QueryBuilders.termQuery("name","张三"));//中文需要额外设置,不然匹配不上searchSourceBuilder.query(QueryBuilders.matchQuery ("name","name"));//searchRequest.source(searchSourceBuilder);//执行SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();System.out.println("hits:"+hits.getTotalHits().toString());//hits:4 hitsSystem.out.println("============================");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()){SearchHit searchHit = iterator.next();System.out.println(searchHit.getSourceAsString());}}>>>>hits:1 hits============================{"name":"This is name","age":30,"desc":"This is desc"}1 hits
4、搜索操作 - SearchSourceBuilder
通过 MatchPhraseQueryBuilder 或者 _TermQueryBuilder_ 等查询器Builder 组装要查询的信息
@Testpublic void search() throws IOException {SearchRequest searchRequest = new SearchRequest(IndicesTest.INDICES_01);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "name");// searchSourceBuilder.query(termQueryBuilder);MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("name", "name");searchSourceBuilder.query(matchPhraseQueryBuilder);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));searchRequest.source(searchSourceBuilder);SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println("搜索结果:" + JSON.toJSONString(search.getHits()));//打印命中文档数据SearchHits hits = search.getHits();Arrays.stream(hits.getHits()).forEach(e -> {System.out.println(e.getSourceAsString());});}
执行结果
搜索结果:{“fragment”:true,”hits”:[{“documentFields”:{},”fields”:{},”fragment”:false,”highlightFields”:{},”id”:”zTX6k34BO8Pm06bHMWPC”,”matchedQueries”:[],”metadataFields”:{},”primaryTerm”:0,”rawSortValues”:[],”score”:1.1129161,”seqNo”:-2,”sortValues”:[],”sourceAsMap”:{“name”:”This is name”,”age”:30,”desc”:”This is desc”},”sourceAsString”:”{\”name\”:\”This is name\”,\”age\”:30,\”desc\”:\”This is desc\”}”,”sourceRef”:{“fragment”:true},”type”:”_doc”,”version”:-1}],”maxScore”:1.1129161,”totalHits”:{“relation”:”EQUAL_TO”,”value”:1}} {“name”:”This is name”,”age”:30,”desc”:”This is desc”}
