引入依赖
修改我们的pom.xml,加入spring-boot-starter-data-elasticsearch
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
编写配置文件
由于ElasticSearch从7.x版本开始淡化TransportClient甚至于在8.x版本中遗弃,所以spring data elasticsearch推荐我们使用rest客户端RestHingLevelClient(端口号使用9200)以及接口ElasticSearchRespositoy。
- RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象
- ElasticSearchRepository 对象操作友好
首先我们编写配置文件如下
@Configuration
public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration{@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("192.168.8.101:9200").build();return RestClients.create(clientConfiguration).rest();}}
RestHighLevelClient方式
有了上面的rest client,我们就可以在其他的地方注入该客户端对ElasticSearch进行操作。我们新建一个测试文件,使用客户端对ElasticSearch进行基本的操作
- 注入RestClient
/*** ElasticSearch Rest client操作** RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象* ElasticSearchRepository 对象操作友好** 我们使用rest client 主要测试文档的操作**/
@SpringBootTest
public class TestRestClient {// 复杂查询使用:比如高亮查询@Autowiredprivate RestHighLevelClient restHighLevelClient;
}
- 插入一条文档
/*** 新增一条文档*/
@Test
public void testAdd() throws IOException {/*** 向ES中的索引christy下的type类型中添加一天文档*/IndexRequest indexRequest = new IndexRequest("christy","user","11");indexRequest.source("{\"name\":\"齐天大圣孙悟空\",\"age\":685,\"bir\":\"1685-01-01\",\"introduce\":\"花果山水帘洞美猴王齐天大圣孙悟空是也!\"," +"\"address\":\"花果山\"}", XContentType.JSON);IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);System.out.println(indexResponse.status());
}
我们可以看到文档插入成功,我们去kibana中查询该条文档
3. 删除一条文档
/*** 删除一条文档*/
@Test
public void deleteDoc() throws IOException {// 我们把特朗普删除了DeleteRequest deleteRequest = new DeleteRequest("christy","user","rYBNG3kBRz-Sn-2f3ViU");DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(deleteResponse.status());}
}
- 更新一条文档
/*** 更新一条文档*/
@Test
public void updateDoc() throws IOException {UpdateRequest updateRequest = new UpdateRequest("christy","user","p4AtG3kBRz-Sn-2fMFjj");updateRequest.doc("{\"name\":\"调皮捣蛋的hardy\"}",XContentType.JSON);UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);System.out.println(updateResponse.status());
}
- 批量更新文档
/*** 批量更新*/
@Test
public void bulkUpdate() throws IOException {BulkRequest bulkRequest = new BulkRequest();// 添加IndexRequest indexRequest = new IndexRequest("christy","user","13");indexRequest.source("{\"name\":\"天蓬元帅猪八戒\",\"age\":985,\"bir\":\"1685-01-01\",\"introduce\":\"天蓬元帅猪八戒因调戏嫦娥被贬下凡\",\"address\":\"高老庄\"}", XContentType.JSON);bulkRequest.add(indexRequest);// 删除DeleteRequest deleteRequest01 = new DeleteRequest("christy","user","pYAtG3kBRz-Sn-2fMFjj");DeleteRequest deleteRequest02 = new DeleteRequest("christy","user","uhTyGHkBExaVQsl4F9Lj");DeleteRequest deleteRequest03 = new DeleteRequest("christy","user","C8zCGHkB5KgTrUTeLyE_");bulkRequest.add(deleteRequest01);bulkRequest.add(deleteRequest02);bulkRequest.add(deleteRequest03);// 修改UpdateRequest updateRequest = new UpdateRequest("christy","user","10");updateRequest.doc("{\"name\":\"炼石补天的女娲\"}",XContentType.JSON);bulkRequest.add(updateRequest);BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);BulkItemResponse[] items = bulkResponse.getItems();for (BulkItemResponse item : items) {System.out.println(item.status());}
}
- 查询文档
@Test
public void testSearch() throws IOException {//创建搜索对象SearchRequest searchRequest = new SearchRequest("christy");//搜索构建对象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery())//执行查询条件.from(0)//起始条数.size(10)//每页展示记录.postFilter(QueryBuilders.matchAllQuery()) //过滤条件.sort("age", SortOrder.DESC);//排序//创建搜索请求searchRequest.types("user").source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println("符合条件的文档总数: "+searchResponse.getHits().getTotalHits());System.out.println("符合条件的文档最大得分: "+searchResponse.getHits().getMaxScore());SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsMap());}
}