码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Elasticsearch - Java API 操作 ES7.16.0+、ES8.x 索引,文档;高级搜索(八)


    阅读本文前可先参考

    Elasticsearch - Java API 操作 ES7.15.0、ES7.x 索引,文档;高级搜索(六)_MinggeQingchun的博客-CSDN博客

    Elasticsearch - Java API(Lambda 表达式) 操作 ES7.16.0+、ES8.x 索引,文档;高级搜索(七)_MinggeQingchun的博客-CSDN博客

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

    以 Elasticsearch7.16.0版本为例 

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

    2、添加依赖

    查看Elasticsearch官网文档

     Installation | Elasticsearch Java API Client [7.16] | Elastic

    1. <dependencies>
    2. <dependency>
    3. <groupId>co.elastic.clientsgroupId>
    4. <artifactId>elasticsearch-javaartifactId>
    5. <version>7.16.0version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.apache.logging.log4jgroupId>
    9. <artifactId>log4j-apiartifactId>
    10. <version>2.17.0version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.apache.logging.log4jgroupId>
    14. <artifactId>log4j-coreartifactId>
    15. <version>2.17.0version>
    16. dependency>
    17. <dependency>
    18. <groupId>com.fasterxml.jackson.coregroupId>
    19. <artifactId>jackson-databindartifactId>
    20. <version>2.12.3version>
    21. dependency>
    22. <dependency>
    23. <groupId>junitgroupId>
    24. <artifactId>junitartifactId>
    25. <version>4.12version>
    26. dependency>
    27. dependencies>

    一、Elasticsearch 客户端对象

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

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

    就像连接 MySQL 数据库一样,Java 通过客户端操作 Elasticsearch 也要获取到连接后才可以使用

    可参考

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

    在第一台服务器节点 es-node-1 设置集群多节点 HTTP 证书 

    基于https 安全的 Elasticsearch 服务,所以首先我们需要将之前的证书进行一个转换

    1. cd /opt/software/elasticsearch-7.16.0/config/certs/
    2. openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys -out java-ca.crt

    将其下载下来并导入到Java项目中

    创建客户端

    1. import co.elastic.clients.elasticsearch.*;
    2. import co.elastic.clients.json.jackson.JacksonJsonpMapper;
    3. import co.elastic.clients.transport.ElasticsearchTransport;
    4. import co.elastic.clients.transport.rest_client.RestClientTransport;
    5. import org.apache.http.HttpHost;
    6. import org.apache.http.auth.*;
    7. import org.apache.http.client.*;
    8. import org.apache.http.conn.ssl.NoopHostnameVerifier;
    9. import org.apache.http.impl.client.*;
    10. import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
    11. import org.apache.http.ssl.*;
    12. import org.elasticsearch.client.*;
    13. import javax.net.ssl.SSLContext;
    14. import java.io.IOException;
    15. import java.io.InputStream;
    16. import java.nio.file.*;
    17. import java.security.KeyManagementException;
    18. import java.security.KeyStore;
    19. import java.security.KeyStoreException;
    20. import java.security.NoSuchAlgorithmException;
    21. import java.security.cert.*;
    22. /**
    23. * 在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient 标记为弃用状态
    24. * 同时推出了全新的Java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端
    25. * Elasticsearch Java API Client 支持除 Vector tile search API 和 Find structure API 之外的所有 Elasticsearch API。
    26. * 且支持所有API数据类型,并且不再有原始JsonValue属性。它是针对Elasticsearch8.0及之后版本的客户端
    27. */
    28. public class ESClient {
    29. public static void main(String[] args) throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
    30. final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    31. credentialsProvider.setCredentials(AuthScope.ANY,
    32. new UsernamePasswordCredentials("elastic", "O3x0hfu7i=ZbQvlktCnd"));
    33. Path caCertificatePath = Paths.get("ca.crt");
    34. CertificateFactory factory =
    35. CertificateFactory.getInstance("X.509");
    36. Certificate trustedCa;
    37. try (InputStream is = Files.newInputStream(caCertificatePath)) {
    38. trustedCa = factory.generateCertificate(is);
    39. }
    40. KeyStore trustStore = KeyStore.getInstance("pkcs12");
    41. trustStore.load(null, null);
    42. trustStore.setCertificateEntry("ca", trustedCa);
    43. SSLContextBuilder sslContextBuilder = SSLContexts.custom()
    44. .loadTrustMaterial(trustStore, null);
    45. final SSLContext sslContext = sslContextBuilder.build();
    46. RestClientBuilder builder = RestClient.builder(
    47. new HttpHost("linux1", 9200, "https"))
    48. .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
    49. @Override
    50. public HttpAsyncClientBuilder customizeHttpClient(
    51. HttpAsyncClientBuilder httpClientBuilder) {
    52. return httpClientBuilder.setSSLContext(sslContext)
    53. .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
    54. .setDefaultCredentialsProvider(credentialsProvider);
    55. }
    56. });
    57. // 创建低级客户端
    58. RestClient restClient = RestClient.builder(new HttpHost("localhost",9200)).build();
    59. // 使用Jackson映射器创建传输层
    60. ElasticsearchTransport transport = new RestClientTransport(restClient,new JacksonJsonpMapper());
    61. // 创建API 同步客户端
    62. ElasticsearchClient esClient = new ElasticsearchClient(transport);
    63. // 创建API 异步客户端
    64. ElasticsearchAsyncClient asyncClient = new ElasticsearchAsyncClient(transport);
    65. // 关闭ES客户端
    66. try {
    67. transport.close();
    68. restClient.close();
    69. } catch (IOException e) {
    70. e.printStackTrace();
    71. }
    72. }
    73. }

    二、索引操作

    1. // 创建索引
    2. CreateIndexRequest request = new
    3. CreateIndexRequest.Builder().index("myindex").build();
    4. final CreateIndexResponse createIndexResponse =
    5. client.indices().create(request);
    6. System.out.println("创建索引成功:" + createIndexResponse.acknowledged());
    7. // 查询索引
    8. GetIndexRequest getIndexRequest = new
    9. GetIndexRequest.Builder().index("myindex").build();
    10. final GetIndexResponse getIndexResponse =
    11. client.indices().get(getIndexRequest);
    12. System.out.println("索引查询成功:" + getIndexResponse.result());
    13. // 删除索引
    14. DeleteIndexRequest deleteIndexRequest = new
    15. DeleteIndexRequest.Builder().index("myindex").build();
    16. final DeleteIndexResponse delete = client.indices().delete(deleteIndexRequest);
    17. final boolean acknowledged = delete.acknowledged();
    18. System.out.println("删除索引成功:" + acknowledged);

    三、文档操作

    1. // 创建文档
    2. IndexRequest indexRequest = new IndexRequest.Builder()
    3. .index("myindex")
    4. .id(user.getId().toString())
    5. .document(user)
    6. .build();
    7. final IndexResponse index = client.index(indexRequest);
    8. System.out.println("文档操作结果:" + index.result());
    9. // 批量创建文档
    10. final List operations = new ArrayList();
    11. for ( int i= 1;i <= 5; i++ ) {
    12. final CreateOperation.Builder builder = new CreateOperation.Builder();
    13. builder.index("myindex");
    14. builder.id("200" + i);
    15. builder.document(new User(2000 + i, 30 + i * 10, "zhangsan" + i, "beijing",
    16. 1000 + i*1000));
    17. final CreateOperation objectCreateOperation = builder.build();
    18. final BulkOperation bulk = new
    19. BulkOperation.Builder().create(objectCreateOperation).build();
    20. operations.add(bulk);
    21. }
    22. BulkRequest bulkRequest = new
    23. BulkRequest.Builder().operations(operations).build();
    24. final BulkResponse bulkResponse = client.bulk(bulkRequest);
    25. System.out.println("数据操作成功:" + bulkResponse);
    26. // 删除文档
    27. DeleteRequest deleteRequest = new
    28. DeleteRequest.Builder().index("myindex").id("1001").build();
    29. client.delete(deleteRequest);
    30. 四、文档高级查询

      1. final SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder().index("myindex1");
      2. MatchQuery matchQuery = new
      3. MatchQuery.Builder().field("city").query(FieldValue.of("beijing")).build();
      4. Query query = new Query.Builder().match(matchQuery).build();
      5. searchRequestBuilder.query(query);
      6. SearchRequest searchRequest = searchRequestBuilder.build();
      7. final SearchResponse search = esClient.search(searchRequest,
      8. Object.class);
      9. System.out.println(search);
      10. 五、客户端异步操作

        1. // 创建索引
        2. asyncClient.indices().create(
        3. req -> {
        4. req.index("newindex");
        5. return req;
        6. }
        7. ).whenComplete(
        8. (resp, error) -> {
        9. System.out.println("回调函数");
        10. if ( resp != null ) {
        11. System.out.println(resp.acknowledged());
        12. } else {
        13. error.printStackTrace();
        14. }
        15. }
        16. );
        17. System.out.println("主线程操作...");
        18. asyncClient.indices().create(
        19. req -> {
        20. req.index("newindex");
        21. return req;
        22. } )
        23. .thenApply(
        24. resp -> {
        25. return resp.acknowledged();
        26. } )
        27. .whenComplete(
        28. (resp, error) -> {
        29. System.out.println("回调函数");
        30. if ( !resp ) {
        31. System.out.println();
        32. } else {
        33. error.printStackTrace();
        34. }
        35. }
        36. );
      11. 相关阅读:
        数据库系统原理与应用教程(042)—— MySQL 查询(四):使用通配符构造查询条件
        第1篇:熊猫烧香之手动查杀
        企业邮箱选择指南:最适合跨境贸易的解决方案推荐
        论文阅读【4】Product-based Neural Networks for User Response Prediction
        正则表达式(Linux 下搭配 grep 使用)
        微信小程序接入lottie动画
        私域增长 | 私域会员:9大连锁行业15个案例集锦
        第二章 Vue基础语法
        51单片机循迹小车原理介绍和代码示例
        Unity 向量计算、欧拉角与四元数转换、输出文本、告警、错误、修改时间、定时器、路径、
      12. 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126851584
        • 最新文章
        • 攻防演习之三天拿下官网站群
          数据安全治理学习——前期安全规划和安全管理体系建设
          企业安全 | 企业内一次钓鱼演练准备过程
          内网渗透测试 | Kerberos协议及其部分攻击手法
          0day的产生 | 不懂代码的"代码审计"
          安装scrcpy-client模块av模块异常,环境问题解决方案
          leetcode hot100【LeetCode 279. 完全平方数】java实现
          OpenWrt下安装Mosquitto
          AnatoMask论文汇总
          【AI日记】24.11.01 LangChain、openai api和github copilot
        • 热门文章
        • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
          奉劝各位学弟学妹们,该打造你的技术影响力了!
          五年了,我在 CSDN 的两个一百万。
          Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
          面试官都震惊,你这网络基础可以啊!
          你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
          心情不好的时候,用 Python 画棵樱花树送给自己吧
          通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
          13 万字 C 语言从入门到精通保姆级教程2021 年版
          10行代码集2000张美女图,Python爬虫120例,再上征途
        Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
        正则表达式工具 cron表达式工具 密码生成工具

        京公网安备 11010502049817号