在大多數(shù)的場景里,存儲數(shù)據(jù)都是用MySQL這類關(guān)系型數(shù)據(jù)庫,這類數(shù)據(jù)庫的特點(diǎn)是數(shù)據(jù)存儲安全性和一致性高,可以用于事務(wù)操作,但是隨著數(shù)據(jù)量的增加,查詢的速度也會隨之降低,并且其擴(kuò)展能力有限,因此在日志記錄和查詢等場景下,MySQL就顯得力不從心,為了解決對海量數(shù)據(jù)的搜索、分析和計(jì)算,引入ES(ElasticSearch)搜索引擎。
對于IOT領(lǐng)域,記錄設(shè)備的控制日志非常的有必要,對于客訴排查或者之后的數(shù)據(jù)分析起著很重要的作用;假如共有100w的設(shè)備,一天控制5次,那一年的數(shù)據(jù):
100w * 5 * 365 = 9 億
因此,為了更為較好地存儲和查詢數(shù)據(jù),對于這種大量增加的數(shù)據(jù)建議用es來存儲。
接下來就介紹一下,如何利用SpringBoot框架聯(lián)合es存儲和查詢數(shù)據(jù)。
- 首先引入依賴
<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;
- 保存數(shù)據(jù),使用es提供save方法
elasticsearchRestTemplate.save(saveBO, getIndex(index_name));
// getIndex() 方法
private IndexCoordinates getIndex(String index) {
return IndexCoordinates.of(index);
}
在save方法中共有兩個(gè)入?yún)?,第一個(gè)參數(shù)就是自己想存儲的數(shù)據(jù),里面的字段根據(jù)業(yè)務(wù)自定義,第二參數(shù)就是定義一個(gè)在es中的索引,其索引就像MySQL中的表名字。
- 查詢es中的數(shù)據(jù)
public List query(QueryParam queryParam){
// 構(gòu)建查詢的條件
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 查詢條件1:設(shè)備id
if (!StringUtil.isEmpty(queryParam.getApplianceId())) {
queryBuilder.filter(QueryBuilders.termQuery("applianceId.keyword", queryParam.getApplianceId()));
}
// 查詢條件2:時(shí)間區(qū)效(開始時(shí)間&結(jié)速時(shí)間需同時(shí)傳輸才生效)
if (queryParam.getOperateBeginDate() != null && queryParam.getOperateEndDate() != null) {
queryBuilder.filter(QueryBuilders.rangeQuery("operateDate").timeZone("Asia/Shanghai") .gte(queryParam.getOperateBeginDate()).lte(queryParam.getOperateEndDate()));
}
// 實(shí)現(xiàn)查詢條件組裝,設(shè)置分頁中的起始頁和每頁大小。
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withPageable(PageRequest.of(queryParam.getPageNo(), queryParam.getPageSize()))
.withSorts(SortBuilders.fieldSort("operateDate").order(SortOrder.DESC))
.build();
// 使用elasticsearchRestTemplate.search查詢數(shù)據(jù)
SearchHits<QueryResult> search = elasticsearchRestTemplate.search(nativeSearchQuery, QueryResult.class, getIndex("index_name"));
// 提取其中的數(shù)據(jù),提出存儲的數(shù)據(jù)QueryResult
List<QueryResult> list = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
}
在查詢方法中,首先使用BoolQueryBuilder來構(gòu)建查詢的條件,在代碼中使用設(shè)備id和時(shí)間進(jìn)行過濾;使用NativeSearchQueryBuilder構(gòu)建好查詢條件、分頁和降序排序;接著使用elasticsearchRestTemplate.search()查詢結(jié)果;最后使用search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList())對查詢的結(jié)果進(jìn)行提取。文章來源:http://www.zghlxwxcb.cn/news/detail-632525.html
通過以上的步驟就可以使用es存儲和查詢數(shù)據(jù),其中elasticsearchRestTemplate集成度高,只需定義好入?yún)⒑统鰠⒓纯?,其他基本都是模塊化操作,非常簡單方便。知道了如何使用,其里面的原理也需要了解下,有機(jī)會再探索下。文章來源地址http://www.zghlxwxcb.cn/news/detail-632525.html
到了這里,關(guān)于如何使用ElasticSearch存儲和查詢數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!