zoukankan      html  css  js  c++  java
  • elasticsearch与springboot整合 并新增简单数据

    es7后,type默认就是_doc。所以创建对象定义的时候,不用命名为别的type就行。

    一 整合

    1、pom.xml 引入elasticsearch相关。

    <!-- es实体声明 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            </dependency>

    junit测试相关

            <!-- 测试 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
              <groupId>org.junit.jupiter</groupId>
              <artifactId>junit-jupiter-engine</artifactId>
              </dependency>
            <dependency>
              <groupId>org.junit.platform</groupId>
              <artifactId>junit-platform-launcher</artifactId>
            </dependency>
            <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.62</version>
            </dependency>

    2、application.yml中加入es地址配置。

    配置文件

    这里中my-elasticsearch为host中的配置es的地址。

    spring:
      data:
        elasticsearch:
         cluster-name: mses-cluster
         cluster-nodes: ms-elasticsearch:9300

    二、代码创建索引映射相关信息。

    1、定义实体:

    实体类中声明对应的索引信息

    @Document(indexName = "house_vo", type="_doc")

    HouseVo.java

    package com.ms.cloud.business.bean;
    
    import java.io.Serializable;
    import java.math.BigDecimal;
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.elasticsearch.annotations.Document;
    import org.springframework.data.elasticsearch.annotations.Field;
    import org.springframework.data.elasticsearch.annotations.FieldType;
    
    import lombok.Data;
    
    @Data // 加上这个声明,就自动带get、set方法了
    @Document(indexName = "house_vo", type="_doc")
    public class HouseVo implements Serializable{ 
        // 这个很重要,这个是ID信息,如果不定义,那么会默认生成一个随机字符串为ID,
        @Id 
        private String pkId;
        
        private String title; //标题
    
        @Field(type = FieldType.Text, analyzer = "ik_max_word")
        private String remark;
    
        @Field(type = FieldType.Keyword)
        private String signMap;
        private Map<String,String> signMap2;    
        // 声明为嵌套类型
        @Field(type = FieldType.Nested)
        private List<HousePhoto> photos;
        // 不声明类型默认为object
        private HouseUser user;
        
        private BigDecimal price;
        
        public HouseVo() {
            
        }
        public HouseVo(String pkId, String title, String remark, List<HousePhoto> photos, HouseUser user,
                BigDecimal price) {
            super();
            this.pkId = pkId;
            this.title = title;
            this.remark = remark;
            this.photos = photos;
            this.user = user;
            this.price = price;
        }
    
    }

    子类 HousePhoto.java

    package com.ms.cloud.business.bean;
    
    import java.io.Serializable;
    import java.util.Date;
    
    import lombok.Data;
    @Data
    public class HousePhoto implements Serializable{ 
        
        private String id;
        
        private String title; //标题
        
        private String remark;
    
        private Date upDate;
        public HousePhoto() {}
        
        public HousePhoto(String id, String title, String remark, Date upDate) {
            super();
            this.id = id;
            this.title = title;
            this.remark = remark;
            this.upDate = upDate;
        }
        
    }

    2、交互操作类 HouseDao

    只需要继承extends ElasticsearchRepository 就可以用es的相关增删改查功能,无需繁琐操作。

    package com.ms.cloud.business.dao;
    
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    import com.ms.cloud.business.bean.HouseVo;
    
    public interface HouseDao extends ElasticsearchRepository<HouseVo, String> {
    
    }

    3、测试写入一些数据

    这里用的是junit进行操作

    package com.ms.cloud;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.rules.TestName;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = ESApp.class)
    public class BaseTest {
    
        
        private Long starttime;
        @Rule
        public TestName junitClass= new TestName();
        @Before
        public void before() {
            starttime = System.currentTimeMillis();
            System.out.println(junitClass.getMethodName() + "....................start....................");
        }
        @After
        public void after() {
            double usedtime = (System.currentTimeMillis() - starttime) / 1000.0;
            System.out.println(junitClass.getMethodName() + "耗时  " + usedtime + " ms");
            System.out.println(junitClass.getMethodName() + "....................end....................");
        }
        
    }

    所有需要用的测试类,继承父类即可用测试。

    package com.ms.cloud.test;
    
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.alibaba.fastjson.JSON;
    import com.ms.cloud.BaseTest;
    import com.ms.cloud.business.bean.HousePhoto;
    import com.ms.cloud.business.bean.HouseUser;
    import com.ms.cloud.business.bean.HouseVo;
    import com.ms.cloud.business.dao.HouseDao;
    
    public class HouseDaoTests extends BaseTest {
    
        @Autowired
        private HouseDao repository;
        
        /**
         * @desc 插入单条信息
         * @date 2020年5月9日 下午2:05:49
         */
        @Test
        public void insert() {
            System.out.println("insert");
            
            HouseUser houseUser = new HouseUser("李无", 25L, new Date());
            List<HousePhoto> photos = new ArrayList<HousePhoto>();
            photos.add(new HousePhoto("p1", "相片01", "五菱最终到es", new Date()));
            photos.add(new HousePhoto("p2", "相片02", "五菱里面会存储一条数据", new Date()));
            photos.add(new HousePhoto("p3", "相片03", "五菱在第二种类型里面", new Date()));
            photos.add(new HousePhoto("p4", "相片04", "五菱而如果声明了car类型是nested", new Date()));
            
            HouseVo houseVo = new HouseVo("2000002", "Eclipse中格式化代码快捷键", "eclipse中格式化代码快捷键Ctrl+Shift+F失效,很长一段时间我的eclie都有个毛病,就是当我要格式化代码的时候,右键", photos, houseUser, new BigDecimal("5089.32"));
            Map<String, String> signMap = new HashMap<>();
            signMap.put("car", "五菱");
            signMap.put("house", "好房");
            houseVo.setSignMap2(signMap);
            repository.save(houseVo);
        }
        /**
         * @desc 批量插入信息
         * @date 2020年5月9日 下午2:05:37
         */
        @Test
        public void insertBatch() {
            System.out.println("insertBatch");
            
            HouseUser houseUser = new HouseUser("李有才", 25L, new Date());
            List<HousePhoto> photos = new ArrayList<HousePhoto>();
            photos.add(new HousePhoto("p1", "相片01", "最终到es", new Date()));
            photos.add(new HousePhoto("p2", "相片02", "里面会存储一条数据", new Date()));
            photos.add(new HousePhoto("p3", "相片03", "在第二种类型里面", new Date()));
            photos.add(new HousePhoto("p4", "相片04", "而如果声明了car类型是nested", new Date()));
    
            HouseVo houseVo2 = new HouseVo("1000002", "陈说美食的个人频道_腾讯视频", "4天前 - 陈说美食 分享美食制作过程,以及制作技巧1068视频 分享 订阅 1.5万 首页 视频 专辑 最新 最热 腾讯视频 v.qq.com 胖妹做“豪横”版海鲜炒饭,8只大虾", photos, houseUser, new BigDecimal("2000.32"));
            HouseVo houseVo3 = new HouseVo("1000003", "陈说美食 简介:分享生活中的美食", "和美食制作方法与技巧 订阅 1.5万粉丝数主页 视频 播单 订阅的频道(0) 还没有订阅过频道! 粉丝(1.5万) ios游客用户", photos, houseUser, new BigDecimal("2000.32"));
            HouseVo houseVo4 = new HouseVo("1000004", "陈说美食 - 知乎", "他的动态 回答了问题1 天前 你在今年的开头悟到了什么? 陈说美食 中国的武汉肺炎 美国的流感 东非的蝗灾 澳洲的山火 ... 今年是个灾年吗?…阅读全文​", photos, houseUser, new BigDecimal("2000.32"));
            HouseVo houseVo5 = new HouseVo("1000005", "陈说美食_视频在线观看-爱奇艺搜索", "2020年2月13日 - 爱奇艺搜索“陈说美食”搜索结果页面为您提供最新最全的“陈说美食”相关视频的搜索和在线观看服务。", photos, houseUser, new BigDecimal("2000.32"));
            
            List<HouseVo> houseVos = new ArrayList<HouseVo>();
            houseVos.add(houseVo2);
            houseVos.add(houseVo3);
            houseVos.add(houseVo4);
            houseVos.add(houseVo5);
            repository.saveAll(houseVos);
        }
        
        /**
         * @desc根据ID查询信息
         * @date 2020年5月9日 下午2:05:22
         */
        @Test
        public void findById() {
            System.out.println("findById");
            Optional<HouseVo> optional = repository.findById("1000002");
            HouseVo houseVo = optional.get();
            System.out.println(JSON.toJSON(optional));
            System.out.println(JSON.toJSON(houseVo));
        }


    /**
    * @desc根据ID删除信息
    * @date 2020年5月9日 下午2:05:22
    */
    @Test
    public void deleteById() {
    repository.deleteById("2000002");
    }

    
    }

    执行完成后,结果如图。

     通过kibana连接上es后,可以看到在es中也创建了相应的索引 house_vo

     如上,看到有一条数据,5个文档条。点击索引可以看到索引的映射关系,也就类似数据库的ddl数据结构类型定义。

    为什么写入一条数据,这里文档是5个,因为类型定义为nested类型的嵌套类型字段,会区分为单独的文档。

    查看数据,如下。

    新增,修改都使用的是save方法或者批量的saveall方法。

    es会根据id来进行区分,是新增,还是修改。

    删除有多重方法,可根据索引对象、全删除、范围。。也是根据ID进行删除即可。

  • 相关阅读:
    Spring(九)Spring中的两种自动代理
    Spring(八)Spring错题总结
    Spring(七)Spring中的四种增强和顾问
    SourceTree使用git
    Idea集成git
    SpringMVC--AbstractController抽象类限定请求提交
    SpringMVC处理器配置方式
    SpringMVC静态资源无法访问解决方案
    SpringMVC--视图解析器
    HandlerMapping执行流程
  • 原文地址:https://www.cnblogs.com/a393060727/p/12857219.html
Copyright © 2011-2022 走看看