一、集成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的版本对应关系
优秀的elasticsearch学习参考文章合集