最近一段时间一直在crud,比较忙碌,来水一篇博客,证明自己在变强的路上😂😂😂😂
ES介绍
elasticsearch就是一个搜索引擎,最多的就是索引库–应对于大数据下的搜索
- 跟他相似的有solr,lucence。elasticsearch的索引库底层是多个Lucence索引组成的
1.索引
2.字段类型(mapping)-(keyword,text)
3.文档(json串) 分片类型
- 和数据库对应关系
mysql数据库可以分为:数据库(database)->表(table) -> 行(row)->列(column)
es相应也分为:索引(index)->类型(type)->文档(document)->字段(field)
Relational DB -> Database-> Table -> Row -> Column
Elasticsearch -> Index -> Type -> Document-> Field
- es7.0以上的type属性没有了
- 简单关键字的定义
1.term 精确匹配 -适用类型keyword
2.prefix 前缀匹配自动补全 -适用类型keyword
3.wildcard 模糊匹配 -比较缓慢,使用类型keyword
4.match 分词匹配 -全文分词检索,不够准确,适用类型text
5.match_phrase 短语匹配 -经常使用,适用类型text
6.query_string 短语匹配 -跟match_phrase差不多,适用类型text
6.multi_match 多组匹配 -适用类型text
7.bool组合匹配(适用场景-text或者keyword)
一个bool过滤器由三部分组成
must-(相当于mysql的and)
must_not -(相当于mysql的not)
should - (相当于mysql的or)
filter - 必须匹配,运行在过滤
8.range范围搜索类型(适用类型long,double,integer,date)
es是倒排索引,是什么意思呢?
通过关键字去寻找主键,再通过主键id去找到该记录的所有值!
整合SpringBoot依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>${es-version}</version>
</dependency>
一些简单的crud
//构建搜索引擎
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//构建查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
QueryBuilder accessControlCondition = QueryBuilders.termQuery("accessControl", "阻塞");
QueryBuilder yearCondition = QueryBuilders.wildcardQuery("day", year+"*");
boolQueryBuilder.must(accessControlCondition);
boolQueryBuilder.must(yearCondition);
searchSourceBuilder.query(boolQueryBuilder);
//进行分组
TermsAggregationBuilder appBuilder = AggregationBuilders.terms("apply").field("apply").size(2147483647);
searchSourceBuilder.aggregation(appBuilder);
//执行搜索
SearchResponse searchResponse = ESUtil.executeQuery(searchSourceBuilder, index);
//结果分类
List<? extends Terms.Bucket> buckets = ESUtil.getBuckets(searchResponse.getAggregations(), "customid");
// 分组统计
// 根据应用名称统计访问次数,并计算下行和上行流量
TermsAggregationBuilder appBuilder = AggregationBuilders.terms("apply").field("apply").size(2147483647);
SumAggregationBuilder downFlowSumBuilder= AggregationBuilders.sum("sum_downFlow").field("downFlow");
SumAggregationBuilder uploadFlowSumBuilder= AggregationBuilders.sum("sum_uploadFlow").field("uploadFlow");
searchSourceBuilder.aggregation(appBuilder.subAggregation(downFlowSumBuilder).subAggregation(uploadFlowSumBuilder));
- ESUtil静态类的公共方法
/**
* 执行查询
*
* @param searchSourceBuilder
* @return
*/
public static SearchResponse executeQuery(SearchSourceBuilder searchSourceBuilder, String index) throws IOException {
//执行查询
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(searchSourceBuilder);
synchronized (ESUtil.class) {
SearchResponse search = null;
try {
search = ESconfig.getClient().search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
} finally {
ESUtil.clean();
}
return search;
}
}
/**
* 获取聚合之后的数据列表 参数就是macAddress
* 类似 TopHitsAggregationBuilder sort = AggregationBuilders.topHits("macAddress").fetchSource(new String[]{"act"}, null)
* .size(1).sort("startDate", SortOrder.DESC);
*
* @param bucket2
* @return
*/
public static Map<String, Object> getBucketHits(Terms.Bucket bucket2, String hitss) {
TopHits macAddressAgg2 = bucket2.getAggregations().get(hitss);
SearchHits hits = macAddressAgg2.getHits();
SearchHit[] hits1 = hits.getHits();
SearchHit documentFields = hits1[0];
Object[] sortValues = documentFields.getSortValues();
Long sortValue = (Long) sortValues[0];
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(sortValue), ZoneId.systemDefault());
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
return sourceAsMap;
}