irpas技术客

Elasticsearch之Java Api操作_星夜孤帆

大大的周 3383

1、Elasticsearch概述 2、Elasticsearch入门 3、Elasticsearch之Java Api操作 4、Elasticsearch集群搭建 5、Elasticsearch进阶 6、Elasticsearch集成SpringBoot 7、Elasticsearch优化 8、Elasticsearch系列总结 一、创建Maven项目?

Elasticsearch软件是由 Java 语言开发的,所以也可以通过 Java API 的方式对 Elasticsearch服务进行访问。

修改pom 文件,增加 Maven 依赖关系。

<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 的客户端 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 依赖 2.x 的 log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency> <!-- junit 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> ?1.1 客户端对象

创建类,代码中创建 Elasticsearch 客户端对象

因为早期版本的客户端对象已经不再推荐使用,且在未来版本中会被删除,所以这里我们采用高级 REST 客户端对象

public static void main(String[] args) throws IOException { // 创建客户端对象 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")) ); // 关闭客户端连接 client.close(); }

注意:

9200 端口为 Elasticsearch 的 Web 通信端口 localhost 为启动 ES 服务的主机名

执行代码,查看控制台信息:

?二、索引操作

ES服务器正常启动后,可以通过 Java API 客户端对象对 ES 索引进行操作?

public class EsIndex { public static void main(String[] args) throws IOException { // 创建客户端对象 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")) ); // 关闭客户端连接 client.close(); } // 创建索引 public static void createIndex(RestHighLevelClient client) throws IOException { // 创建索引 - 请求对象 CreateIndexRequest request = new CreateIndexRequest("user"); // 发送请求,获取响应 CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); boolean acknowledged = response.isAcknowledged(); // 响应状态 System.out.println("操作状态 = " + acknowledged); } // 查看索引 public static void getIndex(RestHighLevelClient client) throws IOException { // 查询索引 - 请求对象 GetIndexRequest request = new GetIndexRequest("user"); // 发送请求,获取响应 GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT); System.out.println("aliases: " + response.getAliases()); System.out.println("mappings: " + response.getMappings()); System.out.println("settings: " + response.getSettings()); } // 删除索引 public static void deleteIndex(RestHighLevelClient client) throws IOException { // 删除索引 - 请求对象 DeleteIndexRequest request = new DeleteIndexRequest("user"); // 发送请求,获取响应 AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT); // 操作结果 System.out.println("操作结果: " + response.isAcknowledged()); } } 三、文档操作 public class EsDoc { public static void main(String[] args) throws IOException { // 创建客户端对象 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")) ); // 关闭客户端连接 client.close(); } // 创建文档 public static void createDoc(RestHighLevelClient client) throws IOException { // 新增文档 - 请求对象 IndexRequest request = new IndexRequest(); // 设置索引及唯一性标识 request.index("user").id("1001"); // 创建数据对象 User user = new User(); user.setAge(26); user.setSex("男"); user.setName("jak"); ObjectMapper objectMapper = new ObjectMapper(); String productJson = objectMapper.writeValueAsString(user); // 添加文档数据, 数据格式为Json格式 request.source(productJson, XContentType.JSON); // 客户端发送请求,获取响应对象 IndexResponse response = client.index(request, RequestOptions.DEFAULT); // 打印结果信息 System.out.println("_index: " + response.getIndex()); System.out.println("id: " + response.getId()); System.out.println("_result: " + response.getResult()); } // 修改文档 public static void updateDoc(RestHighLevelClient client) throws IOException { // 修改文档 - 请求对象 UpdateRequest request = new UpdateRequest(); // 配置修改参数 request.index("user").id("1001"); // 设置请求体,对数据进行修改 request.doc(XContentType.JSON, "sex", "女"); // 客户端发送请求,获取响应对象 UpdateResponse response = client.update(request, RequestOptions.DEFAULT); System.out.println("_index: " + response.getIndex()); System.out.println("_id: " + response.getId()); System.out.println("_result: " + response.getResult()); } // 查询文档 public static void getDoc(RestHighLevelClient client) throws IOException { // 创建请求对象 GetRequest request = new GetRequest().index("user").id("1001"); // 客户端发送请求,获取响应对象 GetResponse response = client.get(request, RequestOptions.DEFAULT); // 打印结果信息 System.out.println("_index: " + response.getIndex()); System.out.println("_type: " + response.getType()); System.out.println("_id: " + response.getId()); System.out.println("source: " + response.getSourceAsString()); } // 删除文档 public static void deleteDoc(RestHighLevelClient client) throws IOException { // 创建请求对象 DeleteRequest request = new DeleteRequest().index("user").id("1"); // 客户端发送请求,获取响应对象 DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); // 打印信息 System.out.println(response.toString()); } // 批量新增 public static void bulkCreateDoc(RestHighLevelClient client) throws IOException { // 创建批量新增请求对象 BulkRequest request = new BulkRequest(); request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan")); request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi")); request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu")); // 客户端发送请求,获取响应对象 BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT); // 打印结果信息 System.out.println("took: " + responses.getTook()); System.out.println("items: " + Arrays.toString(responses.getItems())); } // 批量删除 public static void bulkDeleteDoc(RestHighLevelClient client) throws IOException { // 创建批量删除请求对象 BulkRequest request = new BulkRequest(); request.add(new DeleteRequest().index("user").id("1001")); request.add(new DeleteRequest().index("user").id("1002")); request.add(new DeleteRequest().index("user").id("1003")); // 客户端发送请求,获取响应对象 BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT); // 打印结果信息 System.out.println("took: " + responses.getTook()); System.out.println("items: " + Arrays.toString(responses.getItems())); } } 四、高级查询 public class EsSearch { public static void main(String[] args) throws IOException { // 创建客户端对象 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")) ); // 关闭客户端连接 client.close(); } // 查询所有索引数据 public static void matchAllQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.matchAllQuery()); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // term查询,查询条件为关键字 public static void termQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.termQuery("age", "30")); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 分页查询 public static void pageQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.matchAllQuery()); // 分页查询 // 当前页起始索引(第一条数据的顺序号),from sourceBuilder.from(0); // 每页显示多少条size sourceBuilder.size(2); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 数据排序 public static void sortOrderQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.matchAllQuery()); // 排序 sourceBuilder.sort("age", SortOrder.ASC); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 过滤字段 public static void filterFieldsQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.matchAllQuery()); // 查询字段过滤 String[] excludes = {}; String[] includes = {"name", "age"}; sourceBuilder.fetchSource(includes, excludes); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // Bool查询 public static void boolQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 必须包含 boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30")); // 一定不含 boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan")); // 可能包含 boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男")); // 查询所有数据 sourceBuilder.query(boolQueryBuilder); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 范围查询 public static void rangeQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age"); // 大于等于 rangeQuery.gte("30"); // 小于等于 rangeQuery.lte("40"); // 查询所有数据 sourceBuilder.query(rangeQuery); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 范围查询 public static void fuzzyQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询所有数据 sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "zhangsan").fuzziness(Fuzziness.ONE)); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 高亮查询 public static void highLightQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构建查询方式: 高亮查询 TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan"); // 设置查询方式 sourceBuilder.query(termsQueryBuilder); // 构建高亮字段 HighlightBuilder highlightBuilder = new HighlightBuilder(); // 设置标签前缀 highlightBuilder.preTags("<font color='red'>"); // 设置标签后缀 highlightBuilder.postTags("</font>"); // 设置高亮字段 highlightBuilder.field("name"); // 设置高亮构建对象 sourceBuilder.highlighter(highlightBuilder); // 设置请求体 request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 聚合查询 public static void AggrQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age")); // 设置请求体 request.source(sourceBuilder); // 客户端发送请求,获取响应对象 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } // 分组统计 public static void groupQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest(); request.indices("student"); // 构建查询的请求体 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.aggregation(AggregationBuilders.terms("age_group_by").field("age")); // 设置请求体 request.source(sourceBuilder); // 客户端发送请求,获取响应对象 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 查询匹配 SearchHits hits = response.getHits(); System.out.println("took: " + response.getTook()); System.out.println("timeout: " + response.isTimedOut()); System.out.println("total: " + hits.getTotalHits()); System.out.println("MaxScore: " + hits.getMaxScore()); System.out.println("hits------------->"); for (SearchHit hit : hits) { // 输出每条查询的结果信息 System.out.println(hit.getSourceAsString()); } System.out.println("<-----------------"); } }

视频教程


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #api操作 #JAVA #语言开发的所以也可以通过 #API #的方式对