在大多数的场景里,存储数据都是用MySQL这类关系型数据库,这类数据库的特点是数据存储安全性和一致性高,可以用于事务操作,但是随着数据量的增加,查询的速度也会随之降低,并且其扩展能力有限,因此在日志记录和查询等场景下,MySQL就显得力不从心,为了解决对海量数据的搜索、分析和计算,引入ES(ElasticSearch)搜索引擎。
对于IOT领域,记录设备的控制日志非常的有必要,对于客诉排查或者之后的数据分析起着很重要的作用;假如共有100w的设备,一天控制5次,那一年的数据:
100w * 5 * 365 = 9 亿
因此,为了更为较好地存储和查询数据,对于这种大量增加的数据建议用es来存储。
接下来就介绍一下,如何利用SpringBoot框架联合es存储和查询数据。
- 首先引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.7.4</version>
</dependency>
通过引入依赖之后,就可以使用SpringBoot提供的ElasticsearchRestTemplate模版类,在该类中有着很多方法,很方便使用。
- 配置文件,配置es连接
server:
port: 8080
spring:
elasticsearch:
rest:
uris: http://127.0.0.1:9200
# username: #用户名
# password: #密码
connection-timeout: 6000
read-timeout: 6000
- 接着在使用的地方注入ElasticsearchRestTemplate
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
- 保存数据,使用es提供save方法
elasticsearchRestTemplate.save(saveBO, getIndex(index_name));
// getIndex() 方法
private IndexCoordinates getIndex(String index) {
return IndexCoordinates.of(index);
}
在save方法中共有两个入参,第一个参数就是自己想存储的数据,里面的字段根据业务自定义,第二参数就是定义一个在es中的索引,其索引就像MySQL中的表名字。
- 查询es中的数据
public List query(QueryParam queryParam){
// 构建查询的条件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 查询条件1:设备id
if (!StringUtil.isEmpty(queryParam.getApplianceId())) {
queryBuilder.filter(QueryBuilders.termQuery("applianceId.keyword", queryParam.getApplianceId()));
}
// 查询条件2:时间区效(开始时间&结速时间需同时传输才生效)
if (queryParam.getOperateBeginDate() != null && queryParam.getOperateEndDate() != null) {
queryBuilder.filter(QueryBuilders.rangeQuery("operateDate").timeZone("Asia/Shanghai") .gte(queryParam.getOperateBeginDate()).lte(queryParam.getOperateEndDate()));
}
// 实现查询条件组装,设置分页中的起始页和每页大小。
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withPageable(PageRequest.of(queryParam.getPageNo(), queryParam.getPageSize()))
.withSorts(SortBuilders.fieldSort("operateDate").order(SortOrder.DESC))
.build();
// 使用elasticsearchRestTemplate.search查询数据
SearchHits<QueryResult> search = elasticsearchRestTemplate.search(nativeSearchQuery, QueryResult.class, getIndex("index_name"));
// 提取其中的数据,提出存储的数据QueryResult
List<QueryResult> list = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
}
在查询方法中,首先使用BoolQueryBuilder来构建查询的条件,在代码中使用设备id和时间进行过滤;使用NativeSearchQueryBuilder构建好查询条件、分页和降序排序;接着使用elasticsearchRestTemplate.search()查询结果;最后使用search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList())对查询的结果进行提取。文章来源:https://www.toymoban.com/news/detail-632525.html
通过以上的步骤就可以使用es存储和查询数据,其中elasticsearchRestTemplate集成度高,只需定义好入参和出参即可,其他基本都是模块化操作,非常简单方便。知道了如何使用,其里面的原理也需要了解下,有机会再探索下。文章来源地址https://www.toymoban.com/news/detail-632525.html
到了这里,关于如何使用ElasticSearch存储和查询数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!