• Spring Data ElasticSearch的使用十个小案例


    1、什么是Spring Data

      Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

    2、什么是Spring Data ElasticSearch

      Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

    3.Spring Data ElasticSearch环境  

         1 环境搭建
                步骤一:Spring-Data-ElasticSearch,Spring-test帮助你加载配置文件并且测试
                    ESTemplate模板,模板当中包含了一系列的方法
                   导入依赖:

     
     
              <dependency>
                      <groupId>org.springframework.data</groupId>
                      <artifactId>spring-data-elasticsearch</artifactId>
                      <version>3.1.9.RELEASE</version>
                      <exclusions>
                        <exclusion>
                          <groupId>org.elasticsearch.plugin</groupId>
                          <artifactId>transport‐netty4‐client</artifactId>
                        </exclusion>
                      </exclusions>
                    </dependency>
                    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
                    <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-test</artifactId>
                      <version>5.1.5.RELEASE</version>
                      <scope>test</scope>
                    </dependency>
     
     


                步骤二:创建Spring的核心配置文

     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd">
        <!--开启包扫描-->
        <context:component-scan base-package="com.wdksoft"/>
        <!--配置集群信息-->
        <elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch" cluster-nodes="127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302"/>
        <!--注入ESTemplate模板-->
        <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
            <constructor-arg name="client" ref="esClient"/>
        </bean>
        <!--扫描Mapper-->
        <elasticsearch:repositories base-package="com.wdksoft.mapper"/>
    </beans>
     

        2.SpringDataES案例
            
            1 添加索引库 

     
     
           @RunWith(SpringJUnit4ClassRunner.class)
                @ContextConfiguration(locations = "classpath:applicationContext.xml")
                public class SpringDataESTest {
                    //植入模板对象
                    @Resource
                    private ElasticsearchTemplate elasticsearchTemplate;
    
                    @Test
                    public void createIndex(){
                        //创建空的索引库
                        elasticsearchTemplate.createIndex(Hello.class);
                        
                    }
                }
     

            2 添加索引库并且指定Mapping信息
                利用POJO映射Mapping信

     
     
             @Document(indexName = "my-index",type = "hello")
                    public class Hello {
                        @Id
                        @Field(type = FieldType.Long,index = false,store = true)
                        private Long id;
                        @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
                        private String title;
                        @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
                        private String content;
                    }
     
     
              @Test
                    public void createIndex(){
                        //创建空的索引库
                        elasticsearchTemplate.+(Hello.class);
                        elasticsearchTemplate.putMapping(Hello.class);
                        
                    }
     

            3 添加文档数据
                创建Mapper层接口:

     
     
                    /**
                     * 数据访问层接口
                     */
                    @Repository
                    public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
                    }
     

                创建Service层接口

                    public interface HelloService {
                        public void save(Hello hello);
                    }

                创建Service层接口实现类

     
     
                    @Service("helloService")
                    public class HelloServiceImpl implements HelloService {
                        //植入Mapper层对象
                        @Resource
                        private HelloMapper helloMapper;
    
                        @Override
                        public void save(Hello hello) {
                            helloMapper.save(hello);
                        }
                   }
     

                测试:

     
     
    /**
         * 添加文档数据
         */
        @Test
        public void createDocument(){
            for(long i=1l;i<=10l;i++){
                Hello hello=new Hello();
                hello.setId(i);
                hello.setTitle("新增的Title数据"+i);
                hello.setContent("新增的Content数据"+i);
                helloService.save(hello);
            }
        
     

            4 删除文档数据
                    Service层接口

                        //根据文档ID删除
                        public void deleteById(long id);
                        //删除全部
                        public void deleteAll();

                    Service层接口实现类

     
     
                        @Override
                        public void deleteById(long id) {
                            helloMapper.deleteById(id);
                        }
    
                        @Override
                        public void deleteAll() {
                            helloMapper.deleteAll();
                        }
     

                    测试:

     
     
                /**
                         * 删除文档数据
                         */
                        @Test
                        public void deleteDocument(){
                            //根据文档ID删除
                            helloService.deleteById(1l);
                            //全部删除
                            helloService.deleteAll();
                        }
     

            5 修改文档数据

      修改也是调用save方法,如果id不存在则添加,id存在则先删除再添加

     
     
                /**
                 * 修改文档数据:先删除再添加,调用的还是save方法
                 */
                @Test
                public void updateDocument(){
                    Hello hello=new Hello();
                    hello.setId(1l);
                    hello.setTitle("[修改]新增的Title数据");
                    hello.setContent("[修改]新增的Content数据");
                    helloService.save(hello);
                }
     


            6 根据ID查询
                Service层接口

                        //根据文档ID查询数据
                        public Optional<Hello> findById(Long id);

                Service层接口实现类

                        @Override
                        public Optional<Hello> findById(Long id) {
                            return helloMapper.findById(id);
                        }

                测试:

     
     
                    /**
                     * 根据文档ID查询
                     */
                    @Test
                    public void getDocumentById(){
                        Optional<Hello> optional = helloService.findById(2l);
                        Hello hello = optional.get();
                        System.out.println(hello);
                    
     

            
            7 查询全部文档数据
                Service层接口

                    //查询所有数据
                    public Iterable<Hello> findAll();
                    //查询所有数据包含分页
                    public Page<Hello> findAll(Pageable pageable);

                Service层接口实现类

     
     
                    @Override
                    public Iterable<Hello> findAll() {
                        return helloMapper.findAll();
                    }
    
                    @Override
                    public Page<Hello> findAll(Pageable pageable) {
                        return helloMapper.findAll(pageable);
                    }
     

                测试:    

     
     
                    /**
                     * 查询所有文档数据
                     */
                    @Test
                    public void getAllDocument(){
                        Iterable<Hello> iterable = helloService.findAll();
                        iterable.forEach(item-> System.out.println(item));
                    }
                    /**
                     * 查询所有文档数据加分页
                     */
                    @Test
                    public void getDocumentPage(){
                        //指定分页规则
                        Page<Hello> page = helloService.findAll(PageRequest.of(0, 5));
                        for (Hello hello:page.getContent()) {
                            System.out.println(hello);
                        }
                    }
     

      

            8 根据查询方法的自定义规则进行数据查询
                根据Title域进行查询,并且加分页
                    Mapper层接口:

     
     
                        /**
                         * 数据访问层接口
                         */
                        @Repository
                        public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
                            //根据Title域中的关键词查找数据
                            public List<Hello> findByTitle(String str);
                            //根据Title域中的关键词查找数据
                            public List<Hello> findByTitle(String str, Pageable pageable);
                        }
     

                    Service层接口

                            //根据Title域中的关键词查找数据
                            public List<Hello> findByTitle(String str);
                            //根据Title域中的关键词查找数据
                            public List<Hello> findByTitle(String str, Pageable pageable);

                    Service层接口实现类

     
                        @Override
                        public List<Hello> findByTitle(String str) {
                            return helloMapper.findByTitle(str);
                        }
    
                        @Override
                        public List<Hello> findByTitle(String str, Pageable pageable) {
                            return helloMapper.findByTitle(str,pageable);
                        }
     

                    测试:    

     
     
                        /**
                         * 根据条件查询文档数据加分页
                         */
                        @Test
                        public void getDocumentByTitle(){
                            /*List<Hello> helloLists = helloService.findByTitle("修改");
                            helloLists.stream().forEach(item-> System.out.println(item));*/
    
                            List<Hello> helloLists = helloService.findByTitle("新增", PageRequest.of(0, 5));
                            helloLists.stream().forEach(item-> System.out.println(item));
    
                        }
     


            9 NativeSearchQuery

      将输入的查询条件先分词,再进行查询

     
     
                /**
                 * 根据一段内容查询数据:NativeSearchQuery
                 * 先分词再查询
                 */
                @Test
                public void getDocumentQuery(){
                    //创建NativeSearchQueryBuilder对象
                    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
                    //指定查询规则
                    NativeSearchQuery build = nativeSearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery("搜索新增").defaultField("title"))
                            .withPageable(PageRequest.of(0,5)).build();
                    //使用ESTemplates执行查询
                    List<Hello> hellos = elasticsearchTemplate.queryForList(build, Hello.class);
                    hellos.stream().forEach(item-> System.out.println(item));
                }
  • 相关阅读:
    Installshield 添加应用程序到防火墙例外
    服务器表导入到本地数据库SQL语句
    【转】13个JavaScript图表(JS图表)图形绘制插件
    【转】20个简化开发任务的 JavaScript库
    【转】8 个效果惊人的 WebGL/JavaScript 演示
    【转】JavaScript 3D图表
    VMware显示错误:“未能锁定文件 无法打开磁盘 ..*.vmdk 或者某一个快照所依赖的磁盘。”解决办法
    Spring HTTP invoker简介
    【转】在Ubuntu下建立Eclipse的Android开发环境
    【转】在NetBeans上搭建Android SDK环境
  • 原文地址:https://www.cnblogs.com/danxun/p/12397514.html
Copyright © 2020-2023  润新知