Elasticsearch集成SpringBoot

Elasticsearch集成SpringBoot

找官方文档

Elasticsearch集成SpringBoot_第1张图片

Elasticsearch集成SpringBoot_第2张图片

Elasticsearch集成SpringBoot_第3张图片

1、找到原生的依赖


  org.elasticsearch.client
  elasticsearch-rest-high-level-client
  7.6.2

2、找对象

Elasticsearch集成SpringBoot_第4张图片

3、分析这个类中的方法即可

配置基本的项目

问题:一定要保证 我们的导入的依赖和我们的es 版本一致

Elasticsearch集成SpringBoot_第5张图片

Elasticsearch集成SpringBoot_第6张图片

源码中提供对象

Elasticsearch集成SpringBoot_第7张图片

虽然这里导入3个类,静态内部类,核心类就一个

/**
* Elasticsearch rest client infrastructure configurations.
*
* @author Brian Clozel
* @author Stephane Nicoll
*/
class RestClientConfigurations {
    @Configuration(proxyBeanMethods = false)
    static class RestClientBuilderConfiguration {
        // RestClientBuilder
        @Bean
        @ConditionalOnMissingBean
        RestClientBuilder elasticsearchRestClientBuilder(RestClientProperties
                                                         properties,
                                                         ObjectProvider builderCustomizers) {
            HttpHost[] hosts =
                properties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
            RestClientBuilder builder = RestClient.builder(hosts);
            PropertyMapper map = PropertyMapper.get();
            map.from(properties::getUsername).whenHasText().to((username) -> {
                CredentialsProvider credentialsProvider = new
                    BasicCredentialsProvider();
                Credentials credentials = new
                    UsernamePasswordCredentials(properties.getUsername(),
                                                properties.getPassword());
                credentialsProvider.setCredentials(AuthScope.ANY, credentials);
                builder.setHttpClientConfigCallback(
                    (httpClientBuilder) ->
                    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
            });
            builder.setRequestConfigCallback((requestConfigBuilder) -> {

                map.from(properties::getConnectionTimeout).whenNonNull().asInt(Duration::toMill
                                                                               is)
                    .to(requestConfigBuilder::setConnectTimeout);

                map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis)
                    .to(requestConfigBuilder::setSocketTimeout);
                return requestConfigBuilder;
            });
            builderCustomizers.orderedStream().forEach((customizer) ->
                                                       customizer.customize(builder));
            return builder;
        }
    }
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RestHighLevelClient.class)
    static class RestHighLevelClientConfiguration {
        // RestHighLevelClient 高级客户端,也是我们这里要讲,后面项目会用到的客户端
        @Bean
        @ConditionalOnMissingBean
        RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder
                                                             restClientBuilder) {
            return new RestHighLevelClient(restClientBuilder);
        }
        @Bean
        @ConditionalOnMissingBean
        RestClient elasticsearchRestClient(RestClientBuilder builder,
                                           ObjectProvider restHighLevelClient) {
            RestHighLevelClient client = restHighLevelClient.getIfUnique();
            if (client != null) {
                return client.getLowLevelClient();
            }
            return builder.build();
        }
    }
    @Configuration(proxyBeanMethods = false)
    static class RestClientFallbackConfiguration {
        // RestClient 普通的客户端!
        @Bean
        @ConditionalOnMissingBean
        RestClient elasticsearchRestClient(RestClientBuilder builder) {
            return builder.build();
        }
    }
}

具体的Api测试

  1. 创建索引
  2. 判断索引是否存在
  3. 删除索引
  4. 创建文档
  5. crud文档!

ElasticSearch客户端配置类

核心就是1、找对象        2、放到 spring 中待用

package com.jia.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ElasticSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));  //绑定本地的地址(可绑定多个)
        return client;
    }

}

关于索引的 API 操作

测试创建索引

    @Autowired
    private RestHighLevelClient restHighLevelClient;


    // 测试创建索引
    @Test
    void test1() throws IOException {
        // 创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("jia_index");
        // 客户端执行请求 IndicesClient,请求后获得响应
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse);
    }

Elasticsearch集成SpringBoot_第8张图片

测试获取索引

    // 测试获取索引
    @Test
    void test2() throws IOException {
        GetIndexRequest request = new GetIndexRequest("jia_index");
        boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

 

Elasticsearch集成SpringBoot_第9张图片测试删除索引

    // 测试删除索引
    @Test
    void test3() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("jia_index");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

Elasticsearch集成SpringBoot_第10张图片

关于文档的 API 操作

创建实体类

package com.jia.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
    private String name;
    private int age;
}

测试添加文档

    // 测试添加文档
    @Test
    void test4() throws IOException {
        // 创建对象
        User user = new User("贾宇光", 13);
        // 创建请求
        IndexRequest request = new IndexRequest("jia_index");

        // 规则 PUT /jia_index/_doc/1
        request.id("1");
        request.timeout(TimeValue.timeValueSeconds(1));
        //request.timeout("1s");

        // 将数据放入请求中 json
        request.source(JSON.toJSONString(user), XContentType.JSON);

        // 客户端发送请求,获取响应的结果
        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.toString());    //查看结果
        System.out.println(indexResponse.status());    //查看状态
    }

Elasticsearch集成SpringBoot_第11张图片

获取文档,判断是否存在

    // 获取文档,判断是否存在
    @Test
    void test5() throws IOException {
        GetRequest request = new GetRequest("jia_index", "1");
        // 不获取返回的 _source 的上下文了
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");

        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

Elasticsearch集成SpringBoot_第12张图片

获取文档

    // 获取文档
    @Test
    void test6() throws IOException {
        GetRequest request = new GetRequest("jia_index", "1");
        GetResponse documentFields = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        System.out.println(documentFields.getSourceAsString());     // 打印结果为 String 类型
        System.out.println(documentFields.getSourceAsMap());     // 打印结果为 Map 类型
        System.out.println(documentFields);     // 直接打印查询结果
    }

Elasticsearch集成SpringBoot_第13张图片

更新文档信息

    // 更新文档信息
    @Test
    void test7() throws IOException {
        UpdateRequest request = new UpdateRequest("jia_index", "1");
        request.timeout("1s");

        User user = new User("小羊羊", 111);
        request.doc(JSON.toJSONString(user), XContentType.JSON);

        UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(update.status());
    }

Elasticsearch集成SpringBoot_第14张图片

删除文档信息

    // 删除文档信息
    @Test
    void test8() throws IOException {
        DeleteRequest request = new DeleteRequest("jia_index", "1");
        request.timeout("1s");

        DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.status());
    }

Elasticsearch集成SpringBoot_第15张图片

批量插入数据

    // 批量插入数据
    @Test
    void test9() throws IOException {
        BulkRequest request = new BulkRequest();
        request.timeout("10s");

        ArrayList userList = new ArrayList<>();
        userList.add(new User("贾宇光1", 111));
        userList.add(new User("贾宇光2", 222));
        userList.add(new User("贾宇光3", 333));
        userList.add(new User("贾宇光4", 444));
        userList.add(new User("贾宇光5", 555));
        userList.add(new User("贾宇光6", 666));

        // 批处理请求
        for (int i = 0; i < userList.size(); i++) {
            // 批量添加文档
            request.add(new IndexRequest("jia_index")
                    .id("" + (i + 1))
                    .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));

            // 批量删除文档
            // DeleteRequest deleteRequest = new DeleteRequest("jia_index", ""+(i+1));
            // request.add(deleteRequest);
        }

        BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(bulk.hasFailures());
    }

Elasticsearch集成SpringBoot_第16张图片

查询(精确匹配、匹配所有)

    // 查询
    // SearchRequest 搜索请求
    // SearchSourceBuilder 条件构造
    // 最后提交请求
    @Test
    void test10() throws IOException {
        SearchRequest request = new SearchRequest("jia_index");

        // 构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 精确匹配
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "贾宇光");
        // 匹配所有
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        
        // 设置查询条件
        sourceBuilder.query(termQueryBuilder);
        
        // 设置分页
        // sourceBuilder.from(0);
        // sourceBuilder.size(2);
        
        // 设置超时
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        request.source(sourceBuilder);

        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println("=====================================================");
        System.out.println(JSON.toJSONString(search.getHits()));
        System.out.println("=====================================================");
        for (SearchHit documentFields : search.getHits().getHits()) {
            System.out.println(documentFields.getSourceAsMap());
        }
        System.out.println("=====================================================");
    }

Elasticsearch集成SpringBoot_第17张图片

 

你可能感兴趣的:(ElasticSearch,elasticsearch,spring,boot,java,spring)