zoukankan      html  css  js  c++  java
  • 02-springboot整合elasticsearch初识

    1.ReactiveElasticsearchOperations

        根据springboot官网提供的Elasticsearch操作,除了用rest风格的,还有reactiveElasticSearch的方式。ReactiveElasticsearchOperations是使用来针对Elasticsearch集群执行高级命令的网关ReactiveElasticsearchClient。
    具体如下:

    1.添加依赖

    因为之前增加的依赖,在配置ReactiveElasticsearchOpertions发现了缺少依赖的问题,经过查询,重新调整,增加依赖,如下

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>
    

    2.增加reactiveElasticsearchOperations的bean

    @Configuration
    public class ReactiveElasticsearchConfig extends AbstractReactiveElasticsearchConfiguration {
        /**
         * 配置要使用的客户端。
         * @return
         */
        @Override
        @Bean
        public ReactiveElasticsearchClient reactiveElasticsearchClient() {
            // ...
    //        WebClientProvider http = WebClientProvider.http();
    //        InetSocketAddress inetSocketAddress = new InetSocketAddress("106.52.137.XX", 9200);
    //        HostProvider provider = HostProvider.provider(http, inetSocketAddress);
            final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                    .connectedTo("106.52.137.XX:9200")
                    .build();
            return DefaultReactiveElasticsearchClient.create(clientConfiguration);
        }
    
        /**
         *设置了ElasticsearchConverter用于利用由映射上下文提供的元数据域类型映射
         */ 
        @Override
        @Bean
        public ElasticsearchConverter elasticsearchConverter() {
            return new MappingElasticsearchConverter(elasticsearchMappingContext());
        }
        /**
         * 	域类型元数据的特定于Elasticsearch的映射上下文
         */ 
        @Override
        @Bean
        public SimpleElasticsearchMappingContext elasticsearchMappingContext() {
            return new SimpleElasticsearchMappingContext();
        }
        /**
         * 基于客户端和转换基础结构的实际模板
         */   
        @Bean
        public ReactiveElasticsearchOperations reactiveElasticsearchOperations() {
            return new ReactiveElasticsearchTemplate(reactiveElasticsearchClient(), elasticsearchConverter());
        }
    }
    
    

    3.测试数据的存储和获取

    private ReactiveElasticsearchOperations reactiveElasticsearchOperations;
    
        @Test
        public void reactiveEs(){
            Person block = reactiveElasticsearchOperations.findById("66666", Person.class).block();
            log.info("++++++++++++++++++++++++ {}+++++++++++++++++++",block);
            Person p = Person.builder().id("987314").name("张三丰").age(12).build();
            reactiveElasticsearchOperations.save(p)
                                           .doOnNext(System.out::print)
                                            .flatMap(person -> {
                                                return reactiveElasticsearchOperations.findById("987314",Person.class);
                                            })
                                            .block();
        }
    

    2.Elasticsearch Repositories

    2.1 查询

    2.1.1 通过方法名派生查询

    在此之前,先要学习一下Spring Data Repository
    官网有介绍:Spring数据存储库抽象的目标是显着减少实现各种持久性存储的数据访问层所需的样板代码量。(说白了就是提供了一些简单的样板代码)
    具体文档地址(有比较详细的说明)https://docs.spring.io/spring-data/elasticsearch/docs/4.0.1.RELEASE/reference/html/#repositories.query-methods
    几个基本概念

    1.Spring Data存储库抽象中的中央接口是Repository。它需要域类以及域类的ID类型作为类型参数来进行管理
    
    2.PagingAndSortingRepository抽象,它添加了其他方法来简化对实体的分页访问
    
    3.CrudRepository 计数和删除查询的查询派生。
    
    

    Elasticsearch的Repository

    public interface PersonRepository extends ElasticsearchRepository<Person,String> {
        List<Person> findByNameAndId(String name, int id);
    }
    
    @Test
        public void getPersonByRepository(){
            Iterable<Person> all = repository.findByNameAndId("张三丰",987314);
            all.forEach(person -> {
                System.out.println("================================================");
                System.out.println(person);
                System.out.println("================================================");
            });
    
        }
    

    可以根据关键字将方法名转换成JSON串,具体的转换可以查看官网:
    【Elasticsearch支持的关键字列表】https://docs.spring.io/spring-data/elasticsearch/docs/4.0.1.RELEASE/reference/html/#elasticsearch.reactive.operations

    2.1.2 通过注解形式查询@Query
    public interface PersonRepository extends ElasticsearchRepository<Person,String> {
        @Query("{"match": {"name": {"query": "?0"}}}")
        List<Person> findByName(String name);
    }
    
    @Test
        public void getPersonByRepository(){
            List<Person> zsf = repository.findByName("张三丰");
        }
    
    出现的问题

    问题1.Caused by: org.elasticsearch.client.ResponseException: method [POST], host [http://106.52.137.87:9200], URI [/person_index/person/_search?rest_total_hits_as_int=true&typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&ignore_throttled=true&search_type=dfs_query_then_fetch&batched_reduce_size=512], status line [HTTP/1.1 400 Bad Request]
    {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/person_index/person/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"}],"type":"illegal_argument_exception","reason":"request [/person_index/person/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"},"status":400}

    可以看出来是多了两个参数,然后在网上搜了一下,是es版本的问题,目前的es服务器版本太低。升级了一下,万事ok;
    
  • 相关阅读:
    CodeForce VKcup A
    CNN卷积神经网络
    神经网络
    我的机器学习之路
    [OPENCV] 第一个程序 识别颜色
    Android 登录界面与首页的设计
    go web的基本原理
    Go语言标准库之http/template
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    数据库恢复技术
  • 原文地址:https://www.cnblogs.com/perferect/p/13152176.html
Copyright © 2011-2022 走看看