当前位置: 首页 > news >正文

重庆新闻第一眼中小企业网站seo

重庆新闻第一眼,中小企业网站seo,济南网站建设设计制作公司,网站建设中常见问题分析目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合 1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实…

目录

一、数据聚合

1.1 DSL实现聚合

1.1.1 Bucket聚合 

1.1.2 带条件聚合

1.1.3 Metric聚合

1.1.4 总结

2.1 RestClient实现聚合

2.1.1 Bucket聚合

2.1.2 带条件聚合

2.2.3 Metric聚合


一、数据聚合

聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

  • 什么品牌的手机最受欢迎?

  • 这些手机的平均价格、最高价格、最低价格?

  • 这些手机每月的销售情况如何?

ES实现这些统计功能比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效果。

聚合常见的有三类:

  • 桶(Bucket)聚合:用来对文档做分组

    • TermAggregation:按照文档字段值分组,例如按照品牌值分组、按照国家分组

    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

  • 度量(Metric)聚合:用来计算一些值,比如:最大值、最小值、平均值等

    • Avg:求平均值

    • Max:求最大值

    • Min:求最小值

    • Stats:同时求maxminavgsum

  • 管道(pipeline)聚合:将其它聚合的结果为基础做进一步做深层次的运算(聚合)

注意:参加聚合的字段必须是keyword、日期、数值、布尔类型 

1.1 DSL实现聚合

与之前的搜索功能类似,我们依然先学习DSL的语法,再学习JavaAPI. 

1.1.1 Bucket聚合 

例如我们要统计所有商品中共有哪些商品分类,其实就是以分类(category)字段对数据分组。category值一样的放在同一组,属于Bucket聚合中的Term聚合。 

基本语法如下: 

# 聚合
GET /goods/_search
{"query": {"match_all": {}}, // 当没有条件(查询所有)的时候可以省略"aggs": { // 定义聚合"cate_agg": { // 给聚合起个名字,随意"terms": { // 聚合类型,terms:词条类型的"field": "category", // 参与聚合的字段"size": 20 // 希望获取聚合结果的数量,默认20}}},"size":0 //在查询过程中不仅仅会把聚合结果返回给我们,同时还会把搜索结果的数据返回给我们,设置size为0,就是不需要返回文档信息。如果不设置size默认为10
}

语法说明:

  • size:在查询过程中不仅仅会把聚合结果返回给我们,同时还会把搜索结果的数据返回给我们,设置size为0,就是不需要返回文档信息。如果不设置size默认为10

  • aggs:定义聚合

    • cate_agg:聚合名称,自定义,但不能重复

      • terms:聚合的类型,按分类聚合,所以用term

        • field:参与聚合的字段名称

        • size:希望返回的聚合结果的最大数量

查询的结果: 

这个就有点类始于Sql语句:select  category,count(*)  from goods group by category

一次可以获取多个聚合:

1.1.2 带条件聚合

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可。

例如,查询价格高于1000元的手机品牌有哪些

我们需要从需求中分析出搜索查询的条件和聚合的目标:

  • 搜索查询条件:

    • 价格高于1000

    • 必须是手机

  • 聚合目标:统计的是品牌,肯定是对brand字段做term聚合

语法如下:

# 聚合
GET /goods/_search
{"query": {"bool": {"filter": [{"term": {"category": "手机"}},{"range": {"price": {"gt": 1000}}}]}},"aggs": {"brand_agg":{"terms": {"field": "brand","size": 20}}},"size":0 
}

聚合结果如下:

可以看到,结果中只剩下1个品牌了。。。

1.1.3 Metric聚合

除了对数据分组(Bucket)以外,我们还可以对每个Bucket内的数据进一步做数据计算和统计。

例如:想知道手机有哪些品牌,每个品牌的价格最小值、最大值、平均值。

语法如下:

# 聚合
GET /goods/_search
{"query": {"bool": {"filter": [{"term": {"category": "手机"}}]}},"aggs": {"brand_agg":{"terms": {"field": "brand","size": 20},"aggs": { // 对品牌分组的结果再进行聚合"price_stats": { // 聚合名称随意"stats": { // 聚合类型:Avg:求平均值,Max:求最大值,Min:求最小值,Stats:同时求max、min、avg、sum。"field": "price" // 要聚合字段}}}}},"size":0 
}

可以看到我们在brand_agg聚合的内部,我们新加了一个aggs参数。这个聚合就是brand_agg的子聚合,会对brand_agg形成的每个桶中的文档分别统计。

  • price_stats:聚合名称

    • stats:聚合类型,stats是metric聚合的一种

      • field:聚合字段,这里选择price,统计价格

由于stats是对brand_agg形成的每个品牌桶内文档分别做统计,因此每个品牌都会统计出自己的价格最小、最大、平均值。 

结果如下:

另外,我们还可以让聚合按照每个品牌的价格平均值排序: 

1.1.4 总结

aggs代表聚合,与query同级,此时query的作用是?

  • 限定聚合的的文档范围

聚合必须的三要素:

  • 聚合名称

  • 聚合类型

  • 聚合字段

聚合可配置属性有:

  • size:指定聚合结果数量

  • order:指定聚合结果排序方式

  • field:指定聚合字段 

2.1 RestClient实现聚合

        可以看到在DSL中,aggs聚合条件与query条件是同一级别,都属于查询JSON参数。因此依然是利用request.source()方法来设置。不过聚合条件的要利用AggregationBuilders这个工具类来构造。

2.1.1 Bucket聚合

DSL与JavaAPI的语法对比如下:

聚合结果解析对比:

完整代码:

    @Testpublic void testAgg() throws IOException {// 1.创建Request对象SearchRequest request = new SearchRequest("goods");// 2.准备请求参数request.source().size(0);// 2.1 聚合参数request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(5));// 3.发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 4.解析聚合结果Aggregations aggregations = response.getAggregations();// 4.1 获取品牌聚合Terms brandAgg = aggregations.get("brandAgg");// 4.2 获取聚合中的桶List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();// 4.3 遍历桶内数据for (Terms.Bucket bucket : buckets) {// 4.4 获取桶内keySystem.out.println("key = " + bucket.getKeyAsString());System.out.println("count = " + bucket.getDocCount());}}

执行结果:

2.1.2 带条件聚合

例如,查询价格高于1000元的手机品牌有哪些

DSL与JavaAPI的语法对比如下:

Java代码如下:

    @Testpublic void testConditionAgg() throws IOException {// 1.创建Request对象SearchRequest request = new SearchRequest("goods");// 2.准备请求参数BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("category", "手机")).filter(QueryBuilders.rangeQuery("price").gt(1000));request.source().query(boolQueryBuilder);request.source().size(0);// 2.1 聚合参数request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(5));// 3.发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 4.解析聚合结果Aggregations aggregations = response.getAggregations();// 4.1 获取品牌聚合Terms brandAgg = aggregations.get("brandAgg");// 4.2 获取聚合中的桶List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();// 4.3 遍历桶内数据for (Terms.Bucket bucket : buckets) {// 4.4 获取桶内keySystem.out.println("key = " + bucket.getKeyAsString());System.out.println("count = " + bucket.getDocCount());}}

执行结果:

可以看到,结果中只剩下1个品牌了。。。

2.2.3 Metric聚合

例如:想知道手机有哪些品牌,每个品牌的价格最小值、最大值、平均值。

DSL与JavaAPI的语法对比如下:

结果解析对比:

完整代码如下:

    @Testpublic void testAgg() throws IOException {// 1.创建Request对象SearchRequest request = new SearchRequest("goods");// 2.准备请求参数BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("category", "手机"));request.source().query(boolQueryBuilder);request.source().size(0);// 2.1 聚合参数request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(5).order(// 排序,true:升序(asc),false:降序(desc)BucketOrder.aggregation("priceStats.avg", false) ).subAggregation(AggregationBuilders.stats("priceStats").field("price")));// 3.发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 4.解析聚合结果Aggregations aggregations = response.getAggregations();// 4.1 获取品牌聚合Terms brandAgg = aggregations.get("brandAgg");// 4.2 获取聚合中的桶List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();// 4.3 遍历桶内数据for (Terms.Bucket bucket : buckets) {// 4.4 获取桶内keySystem.out.println("key = " + bucket.getKeyAsString());System.out.println("count = " + bucket.getDocCount());Aggregations subAgg = bucket.getAggregations();Stats priceStats = subAgg.get("priceStats");System.out.println("min = " + priceStats.getMin());System.out.println("max = " + priceStats.getMax());System.out.println("avg = " + priceStats.getAvg());System.out.println("sum = " + priceStats.getSum());}}

执行结果:

 

感谢大家的阅读

http://www.15wanjia.com/news/194488.html

相关文章:

  • 梧州网站建设设计音乐网站开发答辩ppt
  • 网站授权协议女装网站建设的规划书
  • 广东省住房城乡建设部网站WordPress 熊掌号模板
  • 网上商城网站开发公司网站外连
  • php网站开发项目能源网站建设方案
  • wordpress淘宝客建站教程视频建设网站所需要什么
  • 动漫网站建设策划书百度上搜索关键词如何在首页
  • 怎么做领券网站如何增加百度收录
  • 电子商务企业 网站前台建设 苏宁南京网站设计
  • flash网站免费源码带后台服务器买好了怎么搭建自己的网站
  • 生意网官方网站wordpress建站动画
  • 做外墙资料的网站网站建设文化教程
  • 建设银行住房公积金预约网站首页玉田县网站建设
  • 负责公司网站的更新和维护网页页面怎么设计
  • 论坛网站建设视频东莞网站建设求职简历
  • 学习做网站需要多久wordpress手机模板怎么用
  • 网博士自助建站系统下载微信扫码关注登陆wordpress
  • 义乌高端网站设计品牌看免费的视频的软件app
  • 西宁专业做网站公司焦作网站建设哪家专业
  • 自建网站界面设计流程
  • 无锡品牌网站建设介绍营销方向有哪些
  • 自家电脑做网站东莞网络公司 网站建设
  • 投资建设一个网站多少钱wordpress.rar
  • 企业门户网站什么意思常平网站开发
  • 企业网站建设 骆wordpress插件清理
  • 安康企业网站定制wordpress固定链接域名
  • 建设银行网站上交医保做网站图片和文字字体侵权
  • 电商官方网站小程序游戏破解
  • 打开网站iis7高端网站建设 选择磐石网络
  • 做短裙的视频网站湖州建设局新网站