[elastic 8.x]java客户端连接elasticsearch与操作索引与文档

这篇具有很好参考价值的文章主要介绍了[elastic 8.x]java客户端连接elasticsearch与操作索引与文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初始化客户端

引入相关依赖

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.10.2</version>
</dependency>

初始化客户端

为了方便演示,我关闭了elasticsearch的安全验证,带安全验证的初始化方式将在最后专门介绍

String serverUrl="http://127.0.0.1:9200";
RestClient restClient=RestClient
                .builder(HttpHost
                .create(serverUrl))
                .build();
ElasticsearchTransport transport=new RestClientTransport(restClient,new JacksonJsonpMapper());
ElasticsearchClient esClient=new ElasticsearchClient(transport);

索引

创建索引

    void createIndex(){

        String mappings = "{\n" +
                "  \"properties\" : {\n" +
                "    \"id\" : {\n" +
                "      \"type\" : \"keyword\" \n" +
                "    },\n"+
                "    \"name\" : {\n" +
                "      \"type\" : \"text\",\n" +
                "      \"fields\" : {\n" +
                "        \"keyword\" : {\n" +
                "          \"type\" : \"keyword\",\n" +
                "          \"ignore_above\" : 256 \n" +
                "        }\n" +
                "      } \n" +
                "    }, \n" +
                "    \"price\" : { \n" +
                "      \"type\" : \"long\" \n" +
                "     } \n" +
                "  }\n" +
                "}\n";
        JsonpMapper mapper=esClient._transport().jsonpMapper();
        JsonParser parser= Json.createParser(new StringReader(mappings));
        CreateIndexRequest createIndexRequest=new CreateIndexRequest.Builder().index("test")
                .mappings(TypeMapping._DESERIALIZER.deserialize(parser,mapper)).build();
        try {
            esClient.indices().create(createIndexRequest);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

删除索引

    void deleteMapping(){
        try {
            DeleteIndexResponse response;
            response= esClient.indices().delete(deleteIndexRequest->deleteIndexRequest.index("test"));
            System.out.println(response.toString());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

判断索引是否存在

    
    void existsIndex(){
        try {
            BooleanResponse hotel = esClient.indices().exists(existsIndexRequest -> existsIndexRequest.index("hotel"));
            System.out.println(hotel.value());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

文档

新增文档

    void insertDoc(){
        Hotel hotel=hotelService.getById(61083L);
        HotelDoc hotelDoc=new HotelDoc(hotel);
        IndexRequest<HotelDoc> request=new IndexRequest.Builder<HotelDoc>()
                .id("11")
                .index("hotel")
                .document(hotelDoc)
                .build();
        try {
            IndexResponse index = esClient.index(request);
            System.out.println(index.id());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

其中,HotelDoc是一个实体类

删除文档

    void deleteDoc(){
        try {
            esClient.delete(deleteRequest->deleteRequest.index("hotel").id("11"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

查询文档

    void searchDoc(){
        TermQuery termQuery= QueryBuilders.term()
                .field("_id")
                .value("11")
                .build();
        SearchRequest request=new SearchRequest.Builder()
                        .index("hotel")
                        .query(termQuery._toQuery()).build();
        try {
            SearchResponse<HotelDoc> response=esClient.search(request,HotelDoc.class);
            
            //输出结果
            for(Hit<HotelDoc> hit:response.hits().hits()){
                System.out.println(hit.source());
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

更新文档

    void updateDoc(){
        HotelDoc hotelDoc=new HotelDoc();
        //需要更新哪个字段就赋值哪个字段
        hotelDoc.setCity("xx");
        try {
            esClient.update(updateRequest->updateRequest
                            .index("hotel")
                            .id("11")
                            .doc(hotelDoc)
                    ,HotelDoc.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

批量导入文档

    void insertMany(){
        List<Hotel> hotels=hotelService.list();
        List<HotelDoc> hotelDocs=hotels.stream().map(HotelDoc::new).collect(Collectors.toList());
        BulkRequest.Builder bl=new BulkRequest.Builder();
        for(HotelDoc hotelDoc:hotelDocs){
            bl.operations(op->op.index(
                    idx->idx.index("hotel")
                            .id(hotelDoc.getId().toString())
                            .document(hotelDoc)
            ));
        }
        try {
            esClient.bulk(bl.refresh(Refresh.WaitFor).build());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

连接Https集群

带安全验证的连接有点复杂,将下列代码中CA证书的位置改为实际所在的位置就行了。

通过用户名密码连接

password为elastic的密码,可以在我的另一篇文章中查看密码的重置方式
Docker安装部署[8.x]版本Elasticsearch+Kibana+IK分词器

    void makeConnection_https() throws CertificateException, IOException,
            NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        // 创建凭据提供器
        final CredentialsProvider credentialsProvider =
                new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("elastic", password));

        // 设置CA证书路径
        Path caCertificatePath = Paths.get("E:\\tools\\elasticsearch-8.10.2\\config\\certs\\http_ca.crt");
        // 创建证书工厂
        CertificateFactory factory =
                CertificateFactory.getInstance("X.509");
        Certificate trustedCa;
        try (InputStream is = Files.newInputStream(caCertificatePath)) {
            // 从输入流中生成证书
            trustedCa = factory.generateCertificate(is);
        }
        // 创建密钥库
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, null);
        trustStore.setCertificateEntry("ca", trustedCa);
        // 创建SSL上下文构建器
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                .loadTrustMaterial(trustStore, null);
        final SSLContext sslContext = sslContextBuilder.build();

        // 构建Rest客户端构建器
        RestClientBuilder builder = RestClient.builder(
                        new HttpHost("localhost", 9200, "https"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(
                            HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setSSLContext(sslContext)
                                .setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        // 构建Rest客户端
        RestClient restClient = builder.build();

        // 创建Rest客户端传输
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        esClient = new ElasticsearchClient(transport);
//        asyncClient = new ElasticsearchAsyncClient(transport);
    }

通过ApiKey连接

ApiKey在Kibana的Security下生成文章来源地址https://www.toymoban.com/news/detail-848112.html

     void makeConnection_token() throws CertificateException, IOException,
            NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        // 定义CA证书路径
        Path caCertificatePath = Paths.get("E:\\tools\\elasticsearch-8.10.2\\config\\certs\\http_ca.crt");
        // 创建X.509证书工厂
        CertificateFactory factory =
                CertificateFactory.getInstance("X.509");
        Certificate trustedCa;
        try (InputStream is = Files.newInputStream(caCertificatePath)) {
            // 从输入流中生成X.509证书
            trustedCa = factory.generateCertificate(is);
        }
        // 创建PKCS12密钥库
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, null);
        // 将CA证书添加到密钥库
        trustStore.setCertificateEntry("ca", trustedCa);
        // 创建SSL上下文构建器,并设置信任材料
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                .loadTrustMaterial(trustStore, null);
        final SSLContext sslContext = sslContextBuilder.build();

        // 创建Rest客户端构建器
        RestClientBuilder builder = RestClient.builder(
                        new HttpHost("localhost", 9200, "https"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(
                            HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setSSLContext(sslContext);
                    }
                });

        // 设置默认请求头
        Header[] defaultHeaders =
                new Header[]{new BasicHeader("Authorization",
                        "ApiKey yourApiKey")};
        builder.setDefaultHeaders(defaultHeaders);

        // 构建Rest客户端
        RestClient restClient = builder.build();

        // 创建基于RestClient的传输方式
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());

        // 创建Elasticsearch客户端
        esClient = new ElasticsearchClient(transport);
    }

到了这里,关于[elastic 8.x]java客户端连接elasticsearch与操作索引与文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(63)
  • ElasticSearch的客户端操作

    ElasticSearch的客户端操作 使用Kibana进行以下实验,进行Restful接口访问 索引库操作,完成对索引的增、删、查操作 “acknowledged” : true, 代表操作成功 “shards_acknowledged” : true, 代表分片操作成功 “index” : “shopping” 表示创建的索引库名称 注意:创建索引库的分片数默认5片,

    2024年02月12日
    浏览(56)
  • 【Elasticsearch学习笔记五】es常用的JAVA API、es整合SpringBoot项目中使用、利用JAVA代码操作es、RestHighLevelClient客户端对象

    目录 一、Maven项目集成Easticsearch 1)客户端对象 2)索引操作 3)文档操作 4)高级查询 二、springboot项目集成Spring Data操作Elasticsearch 1)pom文件 2)yaml 3)数据实体类 4)配置类 5)Dao数据访问对象 6)索引操作 7)文档操作 8)文档搜索 三、springboot项目集成bboss操作elasticsearch

    2023年04月09日
    浏览(51)
  • Elasticsearch Java客户端

    客户端 优点 缺点 说明 Java Low Level Rest Client 与ES版本之间没有关系,适用于作为所有版本ES的客户端 Java High Level Rest Client 使用最多 使用需与ES版本保持一致 基于Low Level Rest Client, 注意:7.15版本之后将被弃用 TransportClient 使用Transport 接口进行通信,能够使用ES集群中的一些特

    2024年02月15日
    浏览(34)
  • 袁庭新ES系列15节|Elasticsearch客户端基础操作

    上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢?在ES官网中提供了各种语言的客户端,我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择,那么他们有什么区别?这一章节袁老师带领大家来学习Elasticsearch客户端相关

    2024年04月25日
    浏览(51)
  • java socket Server TCP服务端向指定客户端发送消息;可查看、断开指定连接的客户端;以及设置客户端最大可连接数量。

    首先需要知道java里如何创建一个Socket服务器端。 提示:注意server.accept()方法调用会阻塞,只有新的客户端连接后才返回一个新的socket对象。如果一直未连接那么会一直处于阻塞状态 了解了如何创建一个socket服务器端后。那么如何实现给指定的连接客户端发送消息呢?首先我

    2024年02月11日
    浏览(73)
  • 干货 | Elasticsearch Java 客户端演进历史和选型指南

    Elasticsearch 官方提供了很多版本的 Java 客户端,包含但不限于: Transport 客户端 Java REST 客户端 Low Level REST 客户端 High Level REST 客户端 Java API 客户端 非官方的 Java 客户端,包含但不限于: Jest 客户端 BBoss 客户端 Spring Data Elasticsearch 客户端 ...... 写出来的就接近十款客户端! El

    2023年04月11日
    浏览(51)
  • java 客户端操作HDFS

    部署包win版本 源码包zip包 lib整合:共121个jar包 $HADOOP_PREFIX/share/hadoop/{common,hdfs,mapreduce,yarn,tools}/{lib,.}*.jar  将windows版本hadoop/bin/hadoop.dll 放到c:/windows/system32下 hadoop的bin和sbin目录放PATH中+HADOOP_HOME+HADOOP_USER_NAME=root 安装插件 配置 重启电脑!!!!!!!加载hadoop.dll 创建java p

    2024年02月10日
    浏览(54)
  • HDFS之Java客户端操作

    Hadoop版本:Hadoop-3.1.3 Linux版本:CentOS7.5 IDE工具:IntelliJ IDEA(Windows环境下) HDFS的Java客户端操作也是入门Hadoop开发的学习重点 下载依赖 https://github.com/steveloughran/winutils 根据自己的Hadoop安装版本选择对应版本的依赖,如果需要更高版本的依赖,请从以下地址下载 https://github.

    2024年02月12日
    浏览(48)
  • Elasticsearch Java客户端和Spring data elasticsearch-Elasticsearch文章三

    https://www.elastic.co/cn/ 整合springboot看上一篇文章 一定要对应好版本,Elasticsearch 的不同版本变化是真大, https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/ Springboot: 2.7.10 spring-data-elasticsearch: 4.4.10 spring-boot-starter-data-elasticsearch: 2.7.10 elasticsearch-java: 7.17.9 https://github.com/

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包