首页 > 编程语言 > 详细

elasticsearch与springboot整合 并新增简单数据

时间:2020-05-09 15:28:07      阅读:67      评论:0      收藏:0      [点我收藏+]

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进行删除即可。

技术分享图片

 

elasticsearch与springboot整合 并新增简单数据

原文:https://www.cnblogs.com/a393060727/p/12857219.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!