• Elasticsearch - Java API 操作 ES7.15.0、ES7.x 索引,文档;高级搜索(六)


    阅读本文前可先参考

    Elasticsearch - Elasticsearch详解;安装部署(一)_MinggeQingchun的博客-CSDN博客

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

    以 Elasticsearch7.15.0版本为例

    一、Elasticsearch 下载安装部署

    下载地址

    Elasticsearch 7.15.0 | Elastic

     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

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.elasticsearchgroupId>
    4. <artifactId>elasticsearchartifactId>
    5. <version>7.15.0version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.elasticsearch.clientgroupId>
    9. <artifactId>elasticsearch-rest-high-level-clientartifactId>
    10. <version>7.15.0version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.apache.logging.log4jgroupId>
    14. <artifactId>log4j-apiartifactId>
    15. <version>2.11.1version>
    16. dependency>
    17. <dependency>
    18. <groupId>org.apache.logging.log4jgroupId>
    19. <artifactId>log4j-coreartifactId>
    20. <version>2.11.1version>
    21. dependency>
    22. <dependency>
    23. <groupId>com.fasterxml.jackson.coregroupId>
    24. <artifactId>jackson-databindartifactId>
    25. <version>2.10.4version>
    26. dependency>
    27. <dependency>
    28. <groupId>junitgroupId>
    29. <artifactId>junitartifactId>
    30. <version>4.12version>
    31. dependency>
    32. dependencies>

    三、索引操作

    1、创建索引

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 创建索引
    5. CreateIndexRequest request = new CreateIndexRequest("user");
    6. CreateIndexResponse createIndexResponse =
    7. esClient.indices().create(request, RequestOptions.DEFAULT);
    8. // 响应状态
    9. boolean acknowledged = createIndexResponse.isAcknowledged();
    10. System.out.println("索引操作 :" + acknowledged);
    11. esClient.close();

    2、查询索引

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 查询索引
    5. GetIndexRequest request = new GetIndexRequest("user");
    6. GetIndexResponse getIndexResponse =
    7. esClient.indices().get(request, RequestOptions.DEFAULT);
    8. // 响应状态
    9. System.out.println(getIndexResponse.getAliases());
    10. System.out.println(getIndexResponse.getMappings());
    11. System.out.println(getIndexResponse.getSettings());
    12. esClient.close();

    3、删除索引

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 查询索引
    5. DeleteIndexRequest request = new DeleteIndexRequest("user");
    6. AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
    7. // 响应状态
    8. System.out.println(response.isAcknowledged());
    9. esClient.close();

    四、文档操作

    1、创建文档

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 插入数据
    5. IndexRequest request = new IndexRequest();
    6. request.index("user").id("1001");
    7. User user = new User();
    8. user.setName("zhangsan");
    9. user.setAge(30);
    10. user.setSex("男");
    11. // 向ES插入数据,必须将数据转换位JSON格式
    12. ObjectMapper mapper = new ObjectMapper();
    13. String userJson = mapper.writeValueAsString(user);
    14. request.source(userJson, XContentType.JSON);
    15. IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
    16. System.out.println(response.getResult());
    17. esClient.close();

    2、查询文档

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 查询数据
    5. GetRequest request = new GetRequest();
    6. request.index("user").id("1001");
    7. GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
    8. System.out.println(response.getSourceAsString());
    9. esClient.close();

    3、修改文档

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 修改数据
    5. UpdateRequest request = new UpdateRequest();
    6. request.index("user").id("1001");
    7. request.doc(XContentType.JSON, "sex", "女");
    8. UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
    9. System.out.println(response.getResult());
    10. esClient.close();

    4、删除文档

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. DeleteRequest request = new DeleteRequest();
    5. request.index("user").id("1001");
    6. DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
    7. System.out.println(response.toString());
    8. esClient.close();

    5、批量新增

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 批量插入数据
    5. BulkRequest request = new BulkRequest();
    6. // request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age",30,"sex","男"));
    7. // request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age",30,"sex","女"));
    8. // request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age",40,"sex","男"));
    9. // request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu1", "age",40,"sex","女"));
    10. // request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu2", "age",50,"sex","男"));
    11. // request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu3", "age",50,"sex","男"));
    12. //request.add(new IndexRequest().index("user").id("1007").source(XContentType.JSON, "name", "wangwu44", "age",60,"sex","男"));
    13. //request.add(new IndexRequest().index("user").id("1008").source(XContentType.JSON, "name", "wangwu555", "age",60,"sex","男"));
    14. request.add(new IndexRequest().index("user").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age",60,"sex","男"));
    15. BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
    16. System.out.println(response.getTook());
    17. System.out.println(response.getItems());
    18. esClient.close();

    6、批量删除

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 批量删除数据
    5. BulkRequest request = new BulkRequest();
    6. request.add(new DeleteRequest().index("user").id("1001"));
    7. request.add(new DeleteRequest().index("user").id("1002"));
    8. request.add(new DeleteRequest().index("user").id("1003"));
    9. BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
    10. System.out.println(response.getTook());
    11. System.out.println(response.getItems());
    12. esClient.close();

    五、高级查询

    1、全量查询

    1. RestHighLevelClient esClient = new RestHighLevelClient(
    2. RestClient.builder(new HttpHost("localhost", 9200, "http"))
    3. );
    4. // 1. 查询索引的所有数据
    5. SearchRequest request = new SearchRequest();
    6. request.indices("user");
    7. // 构造查询条件
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. builder.query(QueryBuilders.matchAllQuery());
    10. request.source(builder);
    11. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    12. SearchHits hits = response.getHits();
    13. System.out.println(response.getTook());
    14. System.out.println(hits.getTotalHits());
    15. Iterator iterator = hits.iterator();
    16. while (iterator.hasNext()) {
    17. SearchHit hit = iterator.next();
    18. System.out.println(hit.getSourceAsString());
    19. }
    20. esClient.close();
    1. // 1、查询索引中全部的数据
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
    5. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    6. SearchHits hits = response.getHits();
    7. System.out.println(hits.getTotalHits());
    8. System.out.println(response.getTook());
    9. for ( SearchHit hit : hits ) {
    10. System.out.println(hit.getSourceAsString());
    11. }

    2、条件查询

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

    3、分页查询

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

    4、排序查询

    1. // 4. 查询排序
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
    5. //
    6. builder.sort("age", SortOrder.DESC);
    7. request.source(builder);
    8. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    9. SearchHits hits = response.getHits();
    10. System.out.println(hits.getTotalHits());
    11. System.out.println(response.getTook());
    12. for ( SearchHit hit : hits ) {
    13. System.out.println(hit.getSourceAsString());
    14. }

    5、过滤查询

    1. // 5. 过滤字段
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
    5. //
    6. String[] excludes = {"age"};
    7. String[] includes = {};
    8. builder.fetchSource(includes, excludes);
    9. request.source(builder);
    10. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    11. SearchHits hits = response.getHits();
    12. System.out.println(hits.getTotalHits());
    13. System.out.println(response.getTook());
    14. for ( SearchHit hit : hits ) {
    15. System.out.println(hit.getSourceAsString());
    16. }

    6、组合查询

    1. // 6. 组合查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    6. //boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
    7. //boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
    8. //boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
    9. boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
    10. boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));
    11. builder.query(boolQueryBuilder);
    12. request.source(builder);
    13. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    14. SearchHits hits = response.getHits();
    15. System.out.println(hits.getTotalHits());
    16. System.out.println(response.getTook());
    17. for ( SearchHit hit : hits ) {
    18. System.out.println(hit.getSourceAsString());
    19. }

    7、范围查询

    1. // 7. 范围查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
    6. rangeQuery.gte(30);
    7. rangeQuery.lt(50);
    8. builder.query(rangeQuery);
    9. request.source(builder);
    10. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    11. SearchHits hits = response.getHits();
    12. System.out.println(hits.getTotalHits());
    13. System.out.println(response.getTook());
    14. for ( SearchHit hit : hits ) {
    15. System.out.println(hit.getSourceAsString());
    16. }

    8、模糊查询

    1. // 8. 模糊查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO));
    6. request.source(builder);
    7. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    8. SearchHits hits = response.getHits();
    9. System.out.println(hits.getTotalHits());
    10. System.out.println(response.getTook());
    11. for ( SearchHit hit : hits ) {
    12. System.out.println(hit.getSourceAsString());
    13. }

    9、高亮查询

    1. // 9. 高亮查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
    6. HighlightBuilder highlightBuilder = new HighlightBuilder();
    7. highlightBuilder.preTags("");
    8. highlightBuilder.postTags("");
    9. highlightBuilder.field("name");
    10. builder.highlighter(highlightBuilder);
    11. builder.query(termsQueryBuilder);
    12. request.source(builder);
    13. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    14. SearchHits hits = response.getHits();
    15. System.out.println(hits.getTotalHits());
    16. System.out.println(response.getTook());
    17. for ( SearchHit hit : hits ) {
    18. System.out.println(hit.getSourceAsString());
    19. }

    10、聚合查询

    1. // 10. 聚合查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
    6. builder.aggregation(aggregationBuilder);
    7. request.source(builder);
    8. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    9. SearchHits hits = response.getHits();
    10. System.out.println(hits.getTotalHits());
    11. System.out.println(response.getTook());
    12. for ( SearchHit hit : hits ) {
    13. System.out.println(hit.getSourceAsString());
    14. }

    11、分组查询

    1. // 11. 分组查询
    2. SearchRequest request = new SearchRequest();
    3. request.indices("user");
    4. SearchSourceBuilder builder = new SearchSourceBuilder();
    5. AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
    6. builder.aggregation(aggregationBuilder);
    7. request.source(builder);
    8. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    9. SearchHits hits = response.getHits();
    10. System.out.println(hits.getTotalHits());
    11. System.out.println(response.getTook());
    12. for ( SearchHit hit : hits ) {
    13. System.out.println(hit.getSourceAsString());
    14. }
    15. esClient.close();
  • 相关阅读:
    一条慢SQL拖死整个系统
    ThreadPoolExecutor
    玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
    [附源码]计算机毕业设计JAVA在线二手车交易信息管理系统
    江门車馬炮汽车金融中心 11月11日开张
    1320_STM32F103使用串口烧写程序
    C++模拟OpenGL库——图形学状态机接口封装(一):用状态模式重构部分代码及接口定义
    Python3 安装 Matplotlib 报错 pip 无法卸载 pillow 解决方案
    Java面试题-Java核心基础-第八天(异常)
    学git看这一篇就够了!!!
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126762570