ElasticSearch整合SpringBoot&ElasticSearch-Rest-Client-34

一:Elasticsearch-Rest-Client

1)9300:TCP
spring-data-elasticsearch:transport-api.jar;

  • springboot 版本不同, transport-api.jar 不同,不能适配 es 版本
  • 7.x 已经不建议使用,8 以后就要废弃
  • 不建议9300端口操作es

2)9200:HTTP(推荐使用9200端口操作es)

  • JestClient:非官方,更新慢
  • RestTemplate:模拟发 HTTP 请求,ES 很多操作需要自己封装,麻烦
  • HttpClient:同上
  • Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单

结论:
最终选择 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

1.新建gulimail-search微服务

在这里插入图片描述

2.导入es的rest-high-level-client的依赖

		<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
        </dependency>

顺便将es的版本改为7.4.2

	<properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.4.2</elasticsearch.version>
    </properties>

3.添加es的配置

1)在search包下新建config包,并且新建GulimailElasticSearchConfig配置文件
在这里插入图片描述
2)添加@Configuration注解
3)引入common包

		<dependency>
            <groupId>com.sysg.gulimail</groupId>
            <artifactId>gulimail-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

4)在application.properties添加配置

#应用名称
spring.application.name=gulimail-search
#注册发现中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

5)在主启动类添加@EnableDiscoveryClient注解,开启服务注册发现功能
6)编写config配置

@Configuration
public class GulimailElasticSearchConfig {
    @Bean
    public RestHighLevelClient esRestClient(){
        
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
        return client;
    }
}

给容器中注入一个RestHighLevelClient
7)在test中测试es

@SpringBootTest
@RunWith(SpringRunner.class)
public class GulimailSearchApplicationTests {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    @Test
    public void contextLoads() {
        System.out.println(restHighLevelClient);
    }
}

二:测试es的增删改查

1.配置ES安全头信息RequestOptions

作用:当所有请求访问es的时候,会带上请求头信息。此时通过RequestOptions对请求进行一些设置。给每个请求发送之前构建一些授权信息,带上token令牌

public static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
   /*     builder.addHeader("Authorization", "Bearer " + TOKEN);
        builder.setHttpAsyncResponseConsumerFactory(
                new HttpAsyncResponseConsumerFactory
                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));*/
    COMMON_OPTIONS = builder.build();
}

2.测试存储数据到es

   /**
     * 测试存储数据到es
     */
    @Test
    public void indexData() throws IOException {
        //users-需要保存的索引名称
        IndexRequest indexRequest = new IndexRequest("users");
        //设置保存数据的主键
        indexRequest.id("1");
        //添加需要保存的数据
        User user = new User();
        user.setAge(18);
        user.setUserName("sysg");
        user.setGender("男");
          //将user对象转化为json字符串
        String toJSONString = JSON.toJSONString(user);
        indexRequest.source(toJSONString, XContentType.JSON);
        //使用客户端执行保存操作
        IndexResponse index = client.index(indexRequest, GulimailElasticSearchConfig.COMMON_OPTIONS);
        //响应数据
        System.out.println(index);
    }
    @Data
    class User{
        private String userName;
        private String gender;
        private Integer age;
    }

1)首先去kibana中查看user索引
在这里插入图片描述
2)在测试类执行保存方法
在这里插入图片描述
在这里插入图片描述
此时就有数据了!!!
注:更新数据也可以,当主键相同时,就会替换之前的数据!!!!

三:ES完成复杂检索

/**
     * 测试检索数据
     */
    @Test
    public void searchData() throws IOException {
        //1.创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定检索的索引
        searchRequest.indices("bank");
        //指定检索条件,dsl。此方法需要传入searchSourceBuilder对象
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();s
        //1.1)构建检索条件
        //查询条件
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        //聚合条件
        //1.2)按照年龄的值进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);
        //1.3)计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);
        searchRequest.source(sourceBuilder);
        //2.执行检索
        SearchResponse searchResponse = client.search(searchRequest, GulimailElasticSearchConfig.COMMON_OPTIONS);
        //3.分析结果
        /*Map map = JSON.parseObject(searchResponse.toString(), Map.class);*/
        //3.1)获取到所有查询到的数据
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            String string = hit.getSourceAsString();
            JSONObject object = JSON.parseObject(string);
            System.out.println(object);
        }
        //3.2)获取这次检索到的分析信息
        Aggregations aggregations = searchResponse.getAggregations();
        /*for (Aggregation aggregation : aggregations.asList()) {
            String name = aggregation.getName();
            System.out.println("当前聚合名字:"+name);
        }*/
        Terms ageAgg1 = aggregations.get("ageAgg");
        
    }
elasticsearch-rest-client-6.4.3.jar 一直冲突可能有几个原因。 首先,可能是由于版本兼容性问题导致冲突。elasticsearch-rest-client-6.4.3.jar 是 ElasticsearchREST 客户端,如果您的 Elasticsearch 版本与此客户端不兼容,可能会导致冲突。您可以尝试更新 Elasticsearch 或使用与您当前 Elasticsearch 版本兼容的 REST 客户端。 其次,冲突可能是由于您的项目中存在多个版本的 elasticsearch-rest-client-6.4.3.jar。当存在多个相同的 JAR 文件但版本不同的情况下,可能会发生冲突。您可以检查项目的依赖关系,确保只引入一个版本的 elasticsearch-rest-client-6.4.3.jar。 另外,冲突可能是由于其他依赖项与 elasticsearch-rest-client-6.4.3.jar 冲突。在一些情况下,某些依赖项可能需要特定版本的 JAR 文件,并且与 elasticsearch-rest-client-6.4.3.jar 的版本冲突。您可以检查项目的所有依赖项,并确保它们与 elasticsearch-rest-client-6.4.3.jar 的版本兼容。 最后,冲突可能是由于项目中存在其他冲突的依赖项引起的。当项目中存在多个依赖项,它们之间存在冲突时,可能会导致冲突。您可以使用 Maven 或 Gradle 等构建工具来分析项目的依赖关系,并解决任何冲突。 总之,elasticsearch-rest-client-6.4.3.jar 一直冲突可能是由于版本兼容性问题、多个 JAR 文件的存在、与其他依赖项的冲突或其他原因引起的。您可以通过检查兼容性、解决版本冲突、检查依赖项并解决冲突等方式来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随意石光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值