--- icon: logos:elasticsearch title: ElasticSearch API 之 HighLevelRestClient cover: https://raw.githubusercontent.com/dunwu/images/master/snap/202503110759679.webp date: 2022-03-01 18:55:46 categories: - 数据库 - 搜索引擎数据库 - elasticsearch tags: - 数据库 - 搜索引擎数据库 - elasticsearch - API permalink: /pages/3166fcb7/ --- # ElasticSearch API 之 HighLevelRestClient > Elasticsearch 官方的 High Level REST Client 在 7.1.5.0 版本废弃。所以本文中的 API 不推荐使用。 ## 快速开始 ### 引入依赖 在 pom.xml 中引入以下依赖: ```xml org.elasticsearch.client elasticsearch-rest-high-level-client 7.17.1 ``` ### 创建连接和关闭 ```java // 创建连接 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"))); // 关闭 client.close(); ``` ## 索引 API ### 测试准备 ```java public static final String INDEX = "mytest"; public static final String INDEX_ALIAS = "mytest_alias"; /** * {@link User} 的 mapping 结构(json形式) */ public static final String MAPPING_JSON = "{\n" + " \"properties\": {\n" + " \"_class\": {\n" + " \"type\": \"keyword\",\n" + " \"index\": false,\n" + " \"doc_values\": false\n" + " },\n" + " \"description\": {\n" + " \"type\": \"text\",\n" + " \"fielddata\": true\n" + " },\n" + " \"enabled\": {\n" + " \"type\": \"boolean\"\n" + " },\n" + " \"name\": {\n" + " \"type\": \"text\",\n" + " \"fielddata\": true\n" + " }\n" + " }\n" + "}"; @Autowired private RestHighLevelClient client; ``` ### 创建索引 ```java // 创建索引 CreateIndexRequest createIndexRequest = new CreateIndexRequest(INDEX); // 设置索引的 settings createIndexRequest.settings( Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2)); // 设置索引的 mapping createIndexRequest.mapping(MAPPING_JSON, XContentType.JSON); // 设置索引的别名 createIndexRequest.alias(new Alias(INDEX_ALIAS)); AcknowledgedResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT); Assertions.assertTrue(createIndexResponse.isAcknowledged()); ``` ### 删除索引 ```java // 删除索引 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(INDEX); AcknowledgedResponse deleteResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); Assertions.assertTrue(deleteResponse.isAcknowledged()); ``` ### 判断索引是否存在 ```java GetIndexRequest getIndexRequest = new GetIndexRequest(INDEX); Assertions.assertTrue(client.indices().exists(getIndexRequest, RequestOptions.DEFAULT)); GetIndexRequest getIndexAliasRequest = new GetIndexRequest(INDEX_ALIAS); Assertions.assertTrue(client.indices().exists(getIndexAliasRequest, RequestOptions.DEFAULT)); ``` ## 文档 API ### 文档测试准备 ```java public static final String INDEX = "mytest"; public static final String INDEX_ALIAS = "mytest_alias"; /** * {@link User} 的 mapping 结构(json形式) */ public static final String MAPPING_JSON = "{\n" + " \"properties\": {\n" + " \"_class\": {\n" + " \"type\": \"keyword\",\n" + " \"index\": false,\n" + " \"doc_values\": false\n" + " },\n" + " \"description\": {\n" + " \"type\": \"text\",\n" + " \"fielddata\": true\n" + " },\n" + " \"enabled\": {\n" + " \"type\": \"boolean\"\n" + " },\n" + " \"name\": {\n" + " \"type\": \"text\",\n" + " \"fielddata\": true\n" + " }\n" + " }\n" + "}"; @Autowired private RestHighLevelClient client; @BeforeEach public void init() throws IOException { // 创建索引 CreateIndexRequest createIndexRequest = new CreateIndexRequest(INDEX); // 设置索引的 settings createIndexRequest.settings( Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2)); // 设置索引的 mapping createIndexRequest.mapping(MAPPING_JSON, XContentType.JSON); // 设置索引的别名 createIndexRequest.alias(new Alias(INDEX_ALIAS)); AcknowledgedResponse response = client.indices().create(createIndexRequest, RequestOptions.DEFAULT); Assertions.assertTrue(response.isAcknowledged()); // 判断索引是否存在 GetIndexRequest getIndexRequest = new GetIndexRequest(INDEX_ALIAS); Assertions.assertTrue(client.indices().exists(getIndexRequest, RequestOptions.DEFAULT)); GetIndexRequest getIndexAliasRequest = new GetIndexRequest(INDEX_ALIAS); Assertions.assertTrue(client.indices().exists(getIndexAliasRequest, RequestOptions.DEFAULT)); } @AfterEach public void destroy() throws IOException { // 删除索引 DeleteIndexRequest request = new DeleteIndexRequest(INDEX); AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT); Assertions.assertTrue(response.isAcknowledged()); } ``` ### 创建文档 RestHighLevelClient Api 使用 `IndexRequest` 来构建创建文档的请求参数。 【示例】创建 id 为 1 的文档 ```java IndexRequest request = new IndexRequest("product"); request.id("1"); Product product = new Product(); product.setName("机器人"); product.setDescription("人工智能机器人"); product.setEnabled(true); String jsonString = JSONUtil.toJsonStr(product); request.source(jsonString, XContentType.JSON); ``` 同步执行 ```java IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); ``` 异步执行 ```java // 异步执行 client.indexAsync(request, RequestOptions.DEFAULT, new ActionListener() { @Override public void onResponse(IndexResponse indexResponse) { System.out.println(indexResponse); } @Override public void onFailure(Exception e) { System.out.println("执行失败"); } }); ``` ### 删除文档 RestHighLevelClient Api 使用 `DeleteRequest` 来构建删除文档的请求参数。 【示例】删除 id 为 1 的文档 ```java DeleteRequest deleteRequest = new DeleteRequest(INDEX_ALIAS, "1"); ``` 同步执行 ```java DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(deleteResponse); ``` 异步执行 ```java client.deleteAsync(deleteRequest, RequestOptions.DEFAULT, new ActionListener() { @Override public void onResponse(DeleteResponse deleteResponse) { System.out.println(deleteResponse); } @Override public void onFailure(Exception e) { System.out.println("执行失败"); } }); ``` ### 更新文档 RestHighLevelClient Api 使用 `UpdateRequest` 来构建更新文档的请求参数。 【示例】更新 id 为 1 的文档 ```java UpdateRequest updateRequest = new UpdateRequest(INDEX_ALIAS, "1"); Product product3 = new Product(); product3.setName("扫地机器人"); product3.setDescription("人工智能扫地机器人"); product3.setEnabled(true); String jsonString2 = JSONUtil.toJsonStr(product3); updateRequest.doc(jsonString2, XContentType.JSON); ``` 同步执行 ```java UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(updateResponse); ``` 异步执行 ```java client.updateAsync(updateRequest, RequestOptions.DEFAULT, new ActionListener() { @Override public void onResponse(UpdateResponse updateResponse) { System.out.println(updateResponse); } @Override public void onFailure(Exception e) { System.out.println("执行失败"); } }); ``` ### 查看文档 RestHighLevelClient Api 使用 `GetRequest` 来构建查看文档的请求参数。 【示例】查看 id 为 1 的文档 ```java GetRequest getRequest = new GetRequest(INDEX_ALIAS, "1"); ``` 同步执行 ```java GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); ``` 异步执行 ```java client.getAsync(getRequest, RequestOptions.DEFAULT, new ActionListener() { @Override public void onResponse(GetResponse getResponse) { System.out.println(getResponse); } @Override public void onFailure(Exception e) { System.out.println("执行失败"); } }); ``` ### 获取匹配条件的记录总数 ```java @Test @DisplayName("获取匹配条件的记录总数") public void count() throws IOException { SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchPhraseQuery("customer_gender", "MALE")); sourceBuilder.trackTotalHits(true); CountRequest countRequest = new CountRequest(INDEX); countRequest.source(sourceBuilder); CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT); long count = countResponse.getCount(); System.out.println("命中记录数:" + count); } ``` ### 分页查询 ```java @ParameterizedTest @ValueSource(ints = {0, 1, 2, 3}) @DisplayName("分页查询测试") public void pageTest(int page) throws IOException { int size = 10; int offset = page * size; SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchPhraseQuery("customer_gender", "MALE")); sourceBuilder.from(offset); sourceBuilder.size(size); sourceBuilder.trackTotalHits(true); SearchRequest searchRequest = new SearchRequest(INDEX); searchRequest.source(sourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHit[] hits = response.getHits().getHits(); for (SearchHit hit : hits) { KibanaSampleDataEcommerceBean bean = BeanUtil.mapToBean(hit.getSourceAsMap(), KibanaSampleDataEcommerceBean.class, true, CopyOptions.create()); System.out.println(bean); } } ``` ### 条件查询 ```java @Test @DisplayName("条件查询") public void matchPhraseQuery() throws IOException { SearchRequest searchRequest = new SearchRequest(INDEX); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("customer_last_name", "Jensen")); sourceBuilder.query(boolQueryBuilder); sourceBuilder.trackTotalHits(true); searchRequest.source(sourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHit[] hits = response.getHits().getHits(); for (SearchHit hit : hits) { KibanaSampleDataEcommerceBean bean = BeanUtil.mapToBean(hit.getSourceAsMap(), KibanaSampleDataEcommerceBean.class, true, CopyOptions.create()); System.out.println(bean); } } ``` ## 参考资料 - **官方** - [Java High Level REST Client](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html)