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