ElasticSearch简单的工作总结

最近一段时间一直在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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值