elasticsearch-rest-high-level-client操作elasticsearch

本文详细介绍了如何使用elasticsearch-rest-high-level-client库进行CRUD操作,包括非嵌套结构的基本增删改查,以及嵌套类型(如nested applicant和annex)的高级操作,如painless脚本更新和搜索高亮。

摘要

elasticsearch-rest-high-level-client操作elasticsearch
闲的无聊,于是写了这一篇爽文,米娜桑可直接用,除非几乎不可能有bug,有bug当我没说(doge)
QA:无想的一刀欧为啥不用springboot封装的操作依赖涅?
欧认为springboot对操作类过度封装,实现普通简单操作还行,但是涉及到较为复杂的操作时,难以使用,尤其是不同版本的springboot推出的api变化频繁,更加难以使用,es官方推出的api更新不会让操作类变化太频繁,个人感觉spboot操作不如es官方推出的api灵活强大,之前在工作中遇到的需求使用springboot提供的报错难以琢磨,且难以满足需求,所以使用了官方api
elasticsearch版本:7.4
安装操作文档:https://blog.youkuaiyun.com/UnicornRe/article/details/121747039?spm=1001.2014.3001.5501

依赖

依赖最好保持与es版本一致,如果以下依赖报错,在maven < parent > 同级标签旁加上

<properties>
        <java.version>1.8</java.version>
        <!-- <spring-cloud.version>2020.0.2</spring-cloud.version> -->
        <!--解决版本问题-->
        <elasticsearch.version>7.4.0</elasticsearch.version>
</properties>
<!--elasticsearch-->
<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.0</version>
</dependency>
<dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.0</version>
</dependency>

yml配置

可自行修改配置和代码增加多台es机器,address逗号隔开

elasticsearch:
  schema: http
  address: 192.168.52.43:9200
  connectTimeout: 5000
  socketTimeout: 5000
  connectionRequestTimeout: 5000
  maxConnectNum: 100
  maxConnectPerRoute: 100

连接配置

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class EsHighLevalConfigure {
   
   
    //协议 
    @Value("${elasticsearch.schema:http}")
    private String schema="http";
    // 集群地址,如果有多个用“,”隔开 
    @Value("${elasticsearch.address}")
    private String address;
    // 连接超时时间 
    @Value("${elasticsearch.connectTimeout:5000}")
    private int connectTimeout;
    // Socket 连接超时时间 
    @Value("${elasticsearch.socketTimeout:10000}")
    private int socketTimeout;
    // 获取连接的超时时间 
    @Value("${elasticsearch.connectionRequestTimeout:5000}")
    private int connectionRequestTimeout;
    // 最大连接数 
    @Value("${elasticsearch.maxConnectNum:100}")
    private int maxConnectNum;
    // 最大路由连接数 
    @Value("${elasticsearch.maxConnectPerRoute:100}")
    private int maxConnectPerRoute;

    @Bean
    public static RestHighLevelClient restHighLevelClient() {
   
   
        List<HttpHost> hostLists = new ArrayList<>();
        String[] hostList = address.split(",");
        for (String addr : hostList) {
   
   
            String host = addr.split(":")[0];
            String port = addr.split(":")[1];
            hostLists.add(new HttpHost(host, Integer.parseInt(port), schema));
        }
        HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{
   
   });
        // 构建连接对象
        RestClientBuilder builder = RestClient.builder(httpHost);
        // 异步连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
   
   
            requestConfigBuilder.setConnectTimeout(connectTimeout);
            requestConfigBuilder.setSocketTimeout(socketTimeout);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
            return requestConfigBuilder;
        });
        // 异步连接数配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
   
   
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
            httpClientBuilder.setKeepAliveStrategy((response, context) -> Duration.ofMinutes(5).toMillis());
            return httpClientBuilder;
        });
        return new RestHighLevelClient(builder);
    }
}

索引结构

虽然索引结构肯定不是和你们一样的,但是代码结构不需要伤经动骨,
我来简单说说这个结构吧,一条知识产权信息內包含n个文档annex,包含n个(申请人发明人)applicant,
所以使用了 “type”: “nested"嵌套类型,不晓得与"type”: "object"区别的小伙伴自行学习吧,这里就不多说了。
想要学习部分优化的,安装,数据迁移冷备份的可以看看我的文章:(东西太多,部分就没写)https://blog.youkuaiyun.com/UnicornRe/article/details/121747039?spm=1001.2014.3001.5501

PUT /intellectual
{
   
   
  "settings": {
   
   
    "number_of_shards": 1,
    "number_of_replicas": 1
  }
}
 PUT /intellectual/_mapping
{
   
   
        "properties": {
   
   
            "id": {
   
   
            "type": "long"
            },
            "name": {
   
   
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_smart"
            },
            "type": {
   
   
            "type": "keyword"
            },
            "keycode": {
   
   
            "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_smart"
            },
            "officeId": {
   
   
            "type": "keyword"
            },
            "officeName": {
   
   
            "type": "keyword"
            },
            "titular": {
   
   
            "type": "keyword"
            },
            "applyTime": {
   
   
            "type": "long"
            },
            "endTime": {
   
   
            "type": "long"
            },
            "status": {
   
   
            "type": "keyword"
            },
            "agentName": {
   
   
             "type": "text",
             "analyzer": "ik_smart",
             "search_analyzer": "ik_smart"
            },
            "annex": {
   
   
                "type": "nested",
                "properties": {
   
   
                    "id": {
   
   
                    "type": "long"
                    },
                    "name": {
   
   
                     "type": "text",
                     "analyzer": "ik_max_word",
                     "search_analyzer": "ik_smart"
                    },
                    "content": {
   
   
                     "type": "text",
                      "analyzer": "ik_max_word",
                      "search_analyzer": "ik_max_word"
                       },
                    "createTime": {
   
   
                        "type": "long"
                    }
                }
            },
            "applicant": {
   
   
                    "type": "nested",
                    "properties": {
   
   
                                
### Elasticsearch - Rest - High - Level - Client Elasticsearch是开源可扩展的全文检索和分析引擎,用于实时存储、搜索、分析海量信息。Elasticsearch Rest High - Level Client是其官方提供的客户端,提供特定方法API并对请求和响应封装,使用起来较为方便 [^1]。 #### 使用方法 在Spring Boot工程中使用,首先需要添加依赖: ```xml <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.5.1</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.5.1</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.5.1</version> <scope>compile</scope> </dependency> ``` 配置客户端示例: ```java import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; public class ElasticsearchClientConfig { public static RestHighLevelClient getClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); } } ``` ### Elasticsearch - Spark Elasticsearch - Spark 是用于将 Elasticsearch 和 Apache Spark 集成的库,它允许用户在 Spark 应用程序中方便地与 Elasticsearch 进行交互。 #### 使用方法 在 Spark 应用中使用 Elasticsearch - Spark,需要添加相应依赖。以 Maven 为例: ```xml <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-30_2.12</artifactId> <version>7.17.3</version> </dependency> ``` 读取 Elasticsearch 数据到 Spark 的示例代码: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("ElasticsearchToSpark") .master("local[*]") .config("es.nodes", "localhost") .config("es.port", "9200") .getOrCreate() val df = spark.read .format("org.elasticsearch.spark.sql") .load("your_index_name") ``` #### 集成方式 将 Elasticsearch - Rest - High - Level - ClientElasticsearch - Spark 集成时,可以在 Spark 应用中使用 Rest High - Level - Client 进行一些特定的 Elasticsearch 操作。例如,在 Spark 作业中使用 Rest High - Level - ClientElasticsearch 写入数据: ```scala import org.apache.http.HttpHost import org.elasticsearch.client.RestClient import org.elasticsearch.client.RestHighLevelClient import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("IntegrateElasticsearch") .master("local[*]") .getOrCreate() val client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))) // 可以在这里使用 client 进行 Elasticsearch 操作,如索引数据等 ``` ### 最佳实践 - 在使用 Elasticsearch - Rest - High - Level - Client 时,注意处理连接异常和资源释放,避免资源泄漏。 - 使用 Elasticsearch - Spark 时,合理设置批量操作的大小,以提高性能。同时,根据数据量和集群情况,调整 Spark 的并行度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可——叹——落叶飘零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值