本文介绍了如何使用Java API客户端ElasticsearchJavaAPIClient进行Elasticsearch 7.15的下载、安装、索引操作、文档操作,以及高级查询技巧,包括全量查询、条件查询和聚合分析等。
阅读本文前可先参考
Elasticsearch - Elasticsearch详解;安装部署(一)_MinggeQingchun的博客-CSDN博客

https://blog.csdn.net/MinggeQingchun/article/details/126618387

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

以 Elasticsearch7.15.0版本为例

一、Elasticsearch 下载安装部署
下载地址
Elasticsearch 7.15.0 | Elastic

https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-15-0

 Windows版下载之后直接解压到目标目录下即可

二、Elasticsearch 客户端对象
在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient 标记为弃用状态

同时推出了全新的Java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端

1、创建空工程elasticsearch-demo,创建普通Java的maven模块elasticsearch-test

2、添加依赖

查看Elasticsearch官网文档

Appendix A: Dependencies and versions | Elasticsearch Guide [7.15] | Elastic

https://www.elastic.co/guide/en/elasticsearch/reference/7.15/dependencies-versions.html

<dependencies>
    <!-- elasticsearch -->
    <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>7.15.0</version>
    </dependency>
 
    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      <version>7.15.0</version>
    </dependency>
 
    <!-- elasticsearch 依赖 2.x 的 log4j -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.11.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.11.1</version>
    </dependency>
 
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.10.4</version>
    </dependency>
 
    <!-- junit 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>
 

三、索引操作
1、创建索引
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 创建索引
        CreateIndexRequest request = new CreateIndexRequest("user");
        CreateIndexResponse createIndexResponse =
                esClient.indices().create(request, RequestOptions.DEFAULT);
 
        // 响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("索引操作 :" + acknowledged);
 
        esClient.close();
 

2、查询索引
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 查询索引
        GetIndexRequest request = new GetIndexRequest("user");
 
        GetIndexResponse getIndexResponse =
                esClient.indices().get(request, RequestOptions.DEFAULT);
 
        // 响应状态
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());
 
        esClient.close();
 

3、删除索引
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 查询索引
        DeleteIndexRequest request = new DeleteIndexRequest("user");
 
        AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
 
        // 响应状态
        System.out.println(response.isAcknowledged());
 
        esClient.close();
 

四、文档操作
1、创建文档
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 插入数据
        IndexRequest request = new IndexRequest();
        request.index("user").id("1001");
 
        User user = new User();
        user.setName("zhangsan");
        user.setAge(30);
        user.setSex("男");
 
        // 向ES插入数据,必须将数据转换位JSON格式
        ObjectMapper mapper = new ObjectMapper();
        String userJson = mapper.writeValueAsString(user);
        request.source(userJson, XContentType.JSON);
 
        IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
 
        System.out.println(response.getResult());
 
        esClient.close();
 

2、查询文档
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 查询数据
        GetRequest request = new GetRequest();
        request.index("user").id("1001");
        GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
 
        System.out.println(response.getSourceAsString());
 
        esClient.close();
 

3、修改文档
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 修改数据
        UpdateRequest request = new UpdateRequest();
        request.index("user").id("1001");
        request.doc(XContentType.JSON, "sex", "女");
 
        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
 
        System.out.println(response.getResult());
 
        esClient.close();
 

4、删除文档
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        DeleteRequest request = new DeleteRequest();
        request.index("user").id("1001");
 
        DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.toString());
 
        esClient.close();
 

5、批量新增
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 批量插入数据
        BulkRequest request = new BulkRequest();
 
//        request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age",30,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age",30,"sex","女"));
//        request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age",40,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu1", "age",40,"sex","女"));
//        request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu2", "age",50,"sex","男"));
//        request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu3", "age",50,"sex","男"));
        //request.add(new IndexRequest().index("user").id("1007").source(XContentType.JSON, "name", "wangwu44", "age",60,"sex","男"));
        //request.add(new IndexRequest().index("user").id("1008").source(XContentType.JSON, "name", "wangwu555", "age",60,"sex","男"));
        request.add(new IndexRequest().index("user").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age",60,"sex","男"));
 
        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());
 
        esClient.close();
 

6、批量删除
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 批量删除数据
        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 response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(response.getItems());
 
        esClient.close();
 

五、高级查询
1、全量查询
RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
 
        // 1. 查询索引的所有数据
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        // 构造查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
 
        request.source(builder);
 
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(response.getTook());
        System.out.println(hits.getTotalHits());
        Iterator<SearchHit> iterator = hits.iterator();
        while (iterator.hasNext()) {
            SearchHit hit = iterator.next();
            System.out.println(hit.getSourceAsString());
        }
 
        esClient.close();
 

// 1、查询索引中全部的数据
SearchRequest request = new SearchRequest();
        request.indices("user");
 
        request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
 
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

2、条件查询
// 2. 条件查询 : termQuery
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

3、分页查询
// 3. 分页查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // (当前页码-1)*每页显示数据条数
        builder.from(2);
        builder.size(2);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

4、排序查询
// 4. 查询排序
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        //
        builder.sort("age", SortOrder.DESC);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

5、过滤查询
// 5. 过滤字段
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        //
        String[] excludes = {"age"};
        String[] includes = {};
        builder.fetchSource(includes, excludes);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

6、组合查询
// 6. 组合查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 
        //boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
        //boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
        //boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));
 
        builder.query(boolQueryBuilder);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

7、范围查询
// 7. 范围查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
 
        rangeQuery.gte(30);
        rangeQuery.lt(50);
 
        builder.query(rangeQuery);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

8、模糊查询
// 8. 模糊查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO));
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

9、高亮查询
// 9. 高亮查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
 
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        highlightBuilder.field("name");
 
        builder.highlighter(highlightBuilder);
        builder.query(termsQueryBuilder);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

10、聚合查询
// 10. 聚合查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
 
        AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
        builder.aggregation(aggregationBuilder);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 

11、分组查询
// 11. 分组查询
        SearchRequest request = new SearchRequest();
        request.indices("user");
 
        SearchSourceBuilder builder = new SearchSourceBuilder();
 
        AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
        builder.aggregation(aggregationBuilder);
 
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
 
        SearchHits hits = response.getHits();
 
        System.out.println(hits.getTotalHits());
        System.out.println(response.getTook());
 
        for ( SearchHit hit : hits ) {
            System.out.println(hit.getSourceAsString());
        }
 
        esClient.close();
 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐