文章目录
- Springboot-cli 开发脚手架系列
- 简介
- ` Springboot实战演示`
- 环境
- 1. 依赖
- 2. elasticsearch客户端配置
- 3. 业务场景模拟
- 4. 效果测试
- 6. 源码分享
简介
-
Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储您的数据,以便您对形形色色、规模不一的数据进行搜索、索引和分析
-
事实上 Elasticsearch 的完整栈有如下的几个:
Beats 是一些轻量级可以允许在客户端服务器中的代理
Elasticsearch是一个分布式的使用 REST 接口的搜索引擎。
Kibana 针对es的ES的开源分析可视化工具
Logstash的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到 Elasticsearch -
Elasticsearch 安装
-
docker安装Elasticsearch : http://t.csdn.cn/3zkt4
-
其它环境略
- Elasticsearch 7.17.3
- springboot 2.5.3
- jdk 11(代码兼容jdk8)
- pom.xml 我这里springboot的版本为2.5.3
org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test com.alibaba fastjson 1.2.80 org.springframework.boot spring-boot-starter-data-elasticsearch
- yml 这里ip改为你实际的elasticsearch安装地址
elasticsearch: url: 192.168.41.128:92002. elasticsearch客户端配置
- RestClientConfig 配置高级客户端
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Value("${elasticsearch.url}")
private String url;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(url)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
3. 业务场景模拟
- 以用户增删改查为例子
- 创建实体User
@Data
@Accessors(chain = true)
public class User {
private Long userId;
private String username;
private String account;
private String password;
private Date createdDate;
}
- 业务接口
public interface EsUserService {
void createIndex() throws IOException;
boolean indexExists(String indexName) throws IOException;
void getIndex() throws IOException;
void createUser(User user) throws IOException;
void createUserBulk(List userList) throws IOException;
User getUser(long userId) throws IOException;
ArrayList searchUser() throws IOException;
void updateUser(User user) throws IOException;
void deleteUser(long userId) throws IOException;
}
- ES实现类
@RequiredArgsConstructor
@Service
@Slf4j
public class EsUserServiceImpl implements EsUserService {
private final RestHighLevelClient restHighLevelClient;
private static final String USER_INDEX = "user_index";
@Override
public void createIndex() throws IOException {
if (this.indexExists("test_index")) {
return;
}
// 2 创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("test_index");
CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
log.info("创建成功,创建的索引名为:{}", response.index());
}
@Override
public boolean indexExists(String indexName) throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
boolean indexExists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
if (indexExists) {
log.warn("存在索引");
return true;
}
return false;
}
@Override
public void getIndex() throws IOException {
// 1、构建 获取test_index索引的请求
GetIndexRequest request = new GetIndexRequest("test_index");
// 2、客户端判断该索引是否存在
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
log.info("该索引是否存在:{}", exists);
}
@Override
public void createUser(User user) throws IOException {
// 构建请求,创建索引
IndexRequest request = new IndexRequest(USER_INDEX);
request.id(String.valueOf(user.getUserId()));
request.timeout(TimeValue.timeValueSeconds(5));
// 保存的数据
request.source(JSON.toJSONString(user), XContentType.JSON);
// 客户端发送请求,获取响应结果
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
log.info("响应结果:{}", response.toString());
}
@Override
public void createUserBulk(List userList) throws IOException {
// 构建批量插入的请求
BulkRequest request = new BulkRequest();
//设置超时时间
request.timeout("10s");
// 批量插入请求设置
userList.forEach(user -> request.add(
new IndexRequest("user_index")
.id(String.valueOf(user.getUserId()))
.source(JSONObject.toJSONString(user), XContentType.JSON)
));
BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
log.info("批量插入结果:{}", !response.hasFailures());
}
@Override
public User getUser(long userId) throws IOException {
// 获取id为1的文档的信息
GetRequest request = new GetRequest(USER_INDEX, String.valueOf(userId));
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
// 如果存在,获取文档信息
if (exists) {
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
return JSON.parseObject(response.getSourceAsString(), User.class);
}
return null;
}
@Override
public ArrayList searchUser() throws IOException {
// 构建搜索请求
SearchRequest request = new SearchRequest(USER_INDEX);
// 设置搜索条件,使用该构建器进行查询
SearchSourceBuilder builder = new SearchSourceBuilder();
// QueryBuilders.termQuery():精确匹配
// QueryBuilders.matchAllQuery():全文匹配
// 构建精确匹配查询条件
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username.keyword", "李四");
// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 模糊匹配
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("username", "张");
builder.query(wildcardQueryBuilder);
request.source(builder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHit[] hits = response.getHits().getHits();
ArrayList users = new ArrayList<>();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
users.add(JSON.parseObject(hit.getSourceAsString(), User.class));
}
return users;
}
@Override
public void updateUser(User user) throws IOException {
// 通过索引更新
UpdateRequest request = new UpdateRequest(USER_INDEX, String.valueOf(user.getUserId()));
request.doc(JSONObject.toJSONString(user), XContentType.JSON);
// 客户端执行更新请求
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
log.info("更新状态:{}", response.status());
}
@Override
public void deleteUser(long userId) throws IOException {
DeleteRequest request = new DeleteRequest(USER_INDEX, String.valueOf(userId));
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
log.info("删除状态:{}", response.status());
}
}
4. 效果测试
- 编写测试类
@SpringBootTest
@Slf4j
class DomeApplicationTests {
@Autowired
EsUserServiceImpl esUserService;
@Test
void createIndex() throws IOException {
esUserService.createIndex();
esUserService.getIndex();
}
@Test
void createUser() throws IOException {
User user = new User()
.setUserId(1L)
.setUsername("一鸣")
.setAccount("admin1")
.setCreatedDate(new Date())
.setPassword("123456");
esUserService.createUser(user);
}
@Test
void createUserBulk() throws IOException {
// 设置数据
List list = new ArrayList<>();
list.add(new User().setUserId(2L).setUsername("二狗子").setAccount("admin2").setCreatedDate(new Date()));
list.add(new User().setUserId(3L).setUsername("张三").setAccount("admin3").setCreatedDate(new Date()));
list.add(new User().setUserId(4L).setUsername("李四").setAccount("admin4").setCreatedDate(new Date()));
list.add(new User().setUserId(5L).setUsername("王五").setAccount("admin5").setCreatedDate(new Date()));
esUserService.createUserBulk(list);
}
@Test
void getUser() throws IOException {
User user = esUserService.getUser(1L);
log.info("获取到用户为:{}", user);
}
@Test
void searchUser() throws IOException {
ArrayList users = esUserService.searchUser();
log.info("查询结果{}", JSON.toJSONString(users));
}
@Test
void updateUser() throws IOException {
User user = new User()
.setUserId(1L)
.setUsername("一拳超人")
.setAccount("admin1")
.setCreatedDate(new Date())
.setPassword("123456");
esUserService.updateUser(user);
}
@Test
void deleteUser() throws IOException {
esUserService.deleteUser(1L);
}
}
- 部分效果演示
- 批量创建
- 条件查询
- Springboot-cli开发脚手架,集合各种常用框架使用案例,完善的文档,致力于让开发者快速搭建基础环境并让应用跑起来。
- 项目源码github地址
- 项目源码国内gitee地址



