一、集成spring-data-elasticsearch
- 在springboot中集成spring-data-elasticsearch 非常的简单只需要引入下面的start:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
- 在 application.properties l文件配置以下参数:
# es集群的名字 spring.data.elasticsearch.cluster-name=elasticsearch # es机器的可用节点 spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
二、将mysql中数据导入es
本文使用了lombok 加快开发效率,同时使实体类代码看上去更简洁,修改起来也方便1.使用lombok也很简单具体可参考以下连接:一篇文章搞懂Lombok
- 编写实体类
@Data @ToString @NoArgsConstructor @AllArgsConstructor @Document(indexName="myes",type="myuser",refreshInterval="-1") public class User { @Id // 这个id加不加都不影响导入 private Integer id; private String firstName; private String lastName; private Integer age; //type 为字段类型 @Field(type = FieldType.Keyword) private String About; }
- 编写导入的Controller
RestController @RequestMapping("user") public class UserController { private static final Logger log= LoggerFactory.getLogger(UserController.class); @Autowired private UserRepository userRepository; @Autowired private ElasticsearchTemplate estemplate; @RequestMapping("queryString") public Object queryString(String key, @PageableDefault Pageable pageable){ return userRepository.queryString(key, pageable); } /** * 模拟将mysql的数据导入es中 * @return */ @RequestMapping("mysqlToEs") public String mysqlToEs(){ log.info("开始将数据导入es"); long startTime = System.currentTimeMillis(); //模拟从mysql中取到user的集合 List<User> userListMysql = getUserListForMysql(); try { int count = 0; if (estemplate.indexExists(User.class)) { // 如果存在index则先删除,避免数据冗余或者数据刷新不完整 estemplate.deleteIndex(User.class); log.info("删除旧index"); } estemplate.createIndex(User.class); //解决高版本的@Field注解失效问题 estemplate.putMapping(User.class); log.info("新建index"); ArrayList<IndexQuery> queries = new ArrayList<>(); for (User entity : userListMysql ) { IndexQuery indexQuery = new IndexQuery(); //这个地方就是设置主键id,当前你也可以换成其他字段,或者uuid,这个地方默认使用id作为_id的值,即使实体类上不加@Id注解 //indexQuery.setId(UUID.randomUUID().toString()); indexQuery.setId(entity.getId().toString()); indexQuery.setObject(entity); indexQuery.setIndexName("myes"); indexQuery.setType("myuser"); queries.add(indexQuery); if (count % 500 == 0) { estemplate.bulkIndex(queries); queries.clear(); } count++; } if (queries.size() > 0) { estemplate.bulkIndex(queries); log.info("导入完成,耗时:" + (System.currentTimeMillis() - startTime) + "ms"+"导入总条数:"+count); } } catch (Exception e) { e.printStackTrace(); System.out.println("导入失败"); } return "导入成功!"; } public List<User> getUserListForMysql(){ ArrayList<User> userListMysql = new ArrayList<>(); for (int i = 1001; i <1060 ; i++) { userListMysql.add(new User(i,"张","三"+i,i,"简介"+i)) ; } return userListMysql; } @RequestMapping("/flushByIndex") public String flushEsByIndex(){ DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setIndex("myes"); deleteQuery.setType("myuser"); //这个查询一定要有,查询中不设置任何条件即认为是删除当前索引的所有记录 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); deleteQuery.setQuery(boolQueryBuilder); estemplate.delete(deleteQuery); return "清空es数据成功"; } }
- 使用postman访问连接:localhost:8090/user/mysqlToEs
- 使用kibana查看是否导入成功
三、使用ElasticsearchTemplate操作es
本文以下代码测试主要来源于以下连接具体可以参考一下连接:
ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询
四、github源码地址
为了方便各位朋友的测试,使用,学习特将源码发布到了github,欢迎下载学习,交流,共同进步!
https://github.com/Dr-Water/springdata-es-action
ElasticSearch实战 之 es,kibana 的安装和使用
springboot 、spring-data-elasticsearch、elasticserach的版本对应关系