与 SpringBoot 集成
文档:
1、依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>a-version-match-your-es-version</version></dependency>
spring-boot-starter-elasticsearch 各版本:


阅读文档:Getting started 部分
兼容性说明:
- https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-compatibility.html
- 比如
7.15的依赖可以兼容 7.x (x >= 15) 的 ES 版本。(大版本相同,小版本不大于 ES Node)
决定性依赖:(es 的 starter 引入的决定性依赖)
- https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-dependencies.html
- 有两个:
org.elasticsearch.client:elasticsearch-rest-clientorg.elasticsearch:elasticsearch
查看引入的依赖是否与 ES 版本匹配:

2、自动配置


- ElasticsearchRestClientAutoConfiguration
```java @SuppressWarnings(“deprecation”) @Configuration(proxyBeanMethods = false) @ConditionalOnClass(RestClientBuilder.class) @EnableConfigurationProperties({ ElasticsearchProperties.class, ElasticsearchRestClientProperties.class,
@Import({ RestClientBuilderConfiguration.class, RestHighLevelClientConfiguration.class,DeprecatedElasticsearchRestClientProperties.class })
public class ElasticsearchRestClientAutoConfiguration {RestClientSnifferConfiguration.class })
}
- 导入的组件:**_RestHighLevelClientConfiguration_**```java// 导入的组件@Configuration(proxyBeanMethods = false)@ConditionalOnClass(RestHighLevelClient.class)@ConditionalOnMissingBean({ RestHighLevelClient.class, RestClient.class })static class RestHighLevelClientConfiguration {@BeanRestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {return new RestHighLevelClient(restClientBuilder);}}
3、创建组件
初始化,参考:
@Configurationpublic class ElasticsearchClientConfig {@Beanpublic RestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));}}
4、索引操作
- 创建索引 CreateIndexRequest
- 判断索引是否存在 GetIndexRequest
- 删除索引 DeleteIndexRequest
/*创建索引*/@Testpublic void createIdx() throws IOException {// A request to create an indexCreateIndexRequest indexRequest = new CreateIndexRequest("engure_test");// Creates an index using the Create Index APICreateIndexResponse response = restHighLevelClient.indices().create(indexRequest,RequestOptions.DEFAULT);log.info("ack:{}, shardsAck:{}", response.isAcknowledged(), response.isShardsAcknowledged());}/*判断是否存在*/@Testpublic void isIdxExist() throws IOException {GetIndexRequest indexRequest = new GetIndexRequest("engure_test");boolean exists = restHighLevelClient.indices().exists(indexRequest, RequestOptions.DEFAULT);log.info("exists:{}", exists);}/*删除索引*/@Testpublic void delIdx() throws IOException {DeleteIndexRequest indexRequest = new DeleteIndexRequest("engure_test");AcknowledgedResponse response =restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);log.info("act:{}", response.isAcknowledged());}
restHighLevelClient.indices()Provides an IndicesClient which can be used to access the Indices API.
5、文档操作
- 添加。IndexRequest、index()
- 判断存在。GetRequest、exist()
- 根据 id 获取。GetRequest、get()
- 更新。UpdateRequest、update()
- 删除。DeleteRequest、delete()
- 补充:批量操作。BulkRequest、bulk()
- 查询。SearchRequest、SearchSourceBuilder、search()
添加
/*添加文档*/@Testpublic void addDoc() throws IOException {// 准备对象User user = new User("engure", 18, "1999-01-01", Arrays.asList("技术宅", "猛男"));// 创建请求IndexRequest request = new IndexRequest("engure_test");// 相关参数request.id("1");request.timeout(TimeValue.timeValueSeconds(1));// 将对象转换为 json,放入请求request.source(JSON.toJSONString(user), XContentType.JSON);// Index a document using the Index API.IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);log.info("{}", response.toString());}
判断存在
/*判断存在*/@Testpublic void isDocExist() throws IOException {// 创建对象GetRequest getRequest = new GetRequest("engure_test");getRequest.id("1");// 判断是否存在boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);log.info("exists:{}", exists);}
根据 id 获取
/*获取文档*/@Testpublic void getDoc() throws IOException {GetRequest request = new GetRequest("engure_test");request.id("1");GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);log.info("doc: {}", response.toString());log.info("source: {}", response.getSource());}
更新
/*更新文档*/@Testpublic void updateDoc() throws IOException {// 创建更新UpdateRequest request = new UpdateRequest("engure_test", "1");// 传入更新内容// post idx/_doc/1/_update// { doc: {} }request.doc(JSON.toJSONString(new User("engureguo", 20, "1999-09-09", null)), XContentType.JSON);// 文档覆盖更新,而不是文档删除更新!// 执行更新UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);log.info("update: {}", response.toString());}
删除
/*删除文档*/@Testpublic void delDoc() throws IOException {DeleteRequest request = new DeleteRequest("engure_test");request.id("1");DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);log.info("del: {}", response.toString());}
批量操作
/*批量操作。 添加、删除或更新*/@Testpublic void bulkDoc() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout(TimeValue.timeValueSeconds(3));for (int i = 1; i <= 10; i++) {// 添加请求。 同理可以是删除或更新IndexRequest req = new IndexRequest("engure_test"); // 不指定 id 则随机生成req.source(JSON.toJSONString(new User("engure" + String.valueOf(i), 10 + i, "1999-01-01", null)),XContentType.JSON);req.timeout(TimeValue.timeValueSeconds(1));// 将请求加入 bulk 请求bulkRequest.add(req);}BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);log.info("bulk response {}", bulkResponse.toString());}
查询
/*查询文档(复杂查询)*/@Testpublic void searchDoc() throws IOException {SearchRequest searchRequest = new SearchRequest("engure_test");// 创建查询构建器对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchRequest.source(searchSourceBuilder);// 创建查询构建器对象TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "engure");searchSourceBuilder.query(termQueryBuilder);// 排序、分页searchSourceBuilder.sort("age", SortOrder.DESC);searchSourceBuilder.from(0);searchSourceBuilder.size(5);// 高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("name");highlightBuilder.preTags("<b>");highlightBuilder.postTags("</b>");searchSourceBuilder.highlighter(highlightBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);log.info("search res: {}", searchResponse.toString());}
