ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

技术中台下终搜技术解决方案(day03-1)

2020-11-25 18:31:46  阅读:294  来源: 互联网

标签:map product day03 list 技术 aggs 台下 czbk size


写在前面:
文章为作者原创
如需转载,请注明出处

1 指标聚合与下钻分析

背景介绍
ElasticSearch除了致力于搜索之外,也提供了聚合实时分析数据的功能
ElasticSearch的聚合(Aggregations)功能非常强大,允许在数据上做复杂的统计。
聚合两个主要的概念,分别是 桶 和 指标
什么是聚合?
如果把搜索比喻为大海捞针(从海量的文档中找出符合条件的那一个),那麽聚合就是去分析大海中的针们的特性,像是

在大海里有多少针?

针的平均长度是多少?

按照针的製造商来划分,针的长度中位值是多少?

每月加入到海中的针有多少?

这里面有异常的针麽?
 


因此透过聚合,我们可以得到一个数据的概览,聚合能做的是分析和总结全套的数据,而不是查找单个文档(这是搜索做的事)



ElasticSearch的聚合(Aggregations)引入了两个概念:
桶(Buckets):    满足特定条件的文档的集合
指标(Metrics):  对桶内的文档进行统计计算


聚合分析功能主要有四大类别
指标聚合(即计算最大、最小、平均值、求和、计数等功能。比如统计最大值,统计索引中的最高价格)
桶聚合(在下一章节讲)
管道聚合
矩阵聚合
管道聚合和矩阵聚合官方说明是在试验阶段,后期会完全更改或者移除。 


步骤
1、基础框架的搭建
2、分析DSL语法以及实际应用
3、根据DSL高度抽象OpenAPI参数
4、编写OpenAPI聚合java API
5、访问验证

可用作首页聚合,如下

1586075221621

openAPI设计目标与原则:

1、DSL调用与语法进行高度抽象,参数动态设计

2、Open API通过结果转换器支持上百种组合调用

qurey,constant_score,match/matchall/filter/sort/size/frm/higthlight/_source/includes

3、逻辑处理公共调用,提升API业务处理能力

4、尽量保留原生API与参数的用法


1.1 指标聚合与分类

什么是指标聚合(Metric)

聚合分析是数据库中重要的功能特性,完成对某个查询的数据集中数据的聚合计算,
如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。
ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。
对一个数据集求最大值、最小值,计算和、平均值等指标的聚合,在ES中称为指标聚。

Metric聚合分析分为单值分析和多值分析两类
1、单值分析,只输出一个分析结果
min,max,avg,sum,cardinality(cardinality 求唯一值,即不重复的字段有多少(相当于mysql中的distinct)
2、多值分析,输出多个分析结果
stats,extended_stats,percentile,percentile_rank,top_hits

1.2 语法分析

官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-aggregations-metrics.html

语法:

"aggregations" : {
    "<aggregation_name>" : {                                 <!--聚合的名字 -->
        "<aggregation_type>" : {                               <!--聚合的类型 -->
            <aggregation_body>                                 <!--聚合体:对哪些字段进行聚合 -->
        }
        [,"meta" : {  [<meta_data_body>] } ]?               <!--元 -->
        [,"aggregations" : { [<sub_aggregation>]+ } ]?   <!--在聚合里面在定义子聚合 -->
    }
    [,"<aggregation_name_2>" : { ... } ]*                     <!--聚合的名字 -->
}

1.2.1 基础框架搭建

1587349884630

tips:config class

1.2.2 单值分析API设计

1、Avg(平均值)
从聚合文档中提取的价格的平均值。

对所有文档进行avg聚合(DSL)

POST product_list_info/_search
{
  "size": 0,
  "aggs": {
    "czbk": {
      "avg": {
        "field": "price"
      }
    }
  }
}

以上汇总计算了所有文档的平均值。

"size": 0, 表示只查询文档聚合数量,不查文档,如查询50,size=50

aggs:表示是一个聚合

czbk:可自定义,聚合后的数据将显示在自定义字段中

1587361933137

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "avg": {
                    "field": "price"
                }
            }
        }
    }
}

对筛选后的文档聚合

POST product_list_info/_search
{
  "size": 0,
  "query": {
    "term": {
      "onelevel": "手机通讯"
    }
  },
  "aggs": {
    "czbk": {
      "avg": {
        "field": "price"
      }
    }
  }
}

1587361914682

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "term": {
                "onelevel": "手机通讯"
            }
        },
        "aggs": {
            "czbk": {
                "avg": {
                    "field": "price"
                }
            }
        }
    }
}

根据Script计算平均值:

es所使用的脚本语言是painless这是一门安全-高效的脚本语言,基于jvm的

#统计所有
POST product_list_info/_search?size=0
{
  "aggs": {
    "czbk": {
      "avg": {
        "script": {
          "source": "doc.evalcount.value"
        }
      }
    }
  }
}

结果:"value" : 599929.2282791147

#有条件
POST product_list_info/_search?size=0
{
  "query": {
    "term": {
      "onelevel": "手机通讯"
    }
  },
  "aggs": {
    "czbk": {
      "avg": {
        "script": {
          "source": "doc.evalcount.value"
        }
      }
    }
  }
}
结果:"value" : 600055.6935087288

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "avg": {
                    "script": {
                        "source": "doc.evalcount.value"
                    }
                }
            }
        }
    }
}

总结:

avg平均

1、统一avg(所有文档)

2、有条件avg(部分文档)

3、脚本统计(所有)

3、脚本统计(部分)

代码编写

  if (m.getValue() instanceof ParsedAvg) {
            map.put("value", ((ParsedAvg) m.getValue()).getValue());
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

2、Max(最大值)
计算从聚合文档中提取的数值的最大值。

统计所有文档

POST product_list_info/_search
{
  "size": 0,
  "aggs": {
    "czbk": {
      "max": {
        "field": "price"
      }
    }
  }
}

结果: "value" : 9.9999999E7

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "max": {
                    "field": "price"
                }
            }
        }
    }
}

统计过滤后的文档

POST product_list_info/_search
{
  "size": 0,
  "query": {
    "term": {
      "onelevel": "手机通讯"
    }
  },
  "aggs": {
    "czbk": {
      "max": {
        "field": "price"
      }
    }
  }
}

结果: "value" : 2474000.0

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "term": {
                "onelevel": "手机通讯"
            }
        },
        "aggs": {
            "czbk": {
                "max": {
                    "field": "price"
                }
            }
        }
    }
}

结果: "value" : 2474000.0

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "term": {
                "onelevel": "手机通讯"
            }
        },
        "aggs": {
            "czbk": {
                "max": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

//最大值
 else if (m.getValue() instanceof ParsedMax) {
         map.put("value", ((ParsedMax) m.getValue()).getValue());
}

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

3、Min(最小值)
计算从聚合文档中提取的数值的最小值。

统计所有文档

POST product_list_info/_search
{
  "size": 0,
  "aggs": {
    "czbk": {
      "min": {
        "field": "price"
      }
    }
  }
}

结果:"value": 0.0

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "min": {
                    "field": "price"
                }
            }
        }
    }
}

统计筛选后的文档

POST product_list_info/_search
{
  "size": 1,
  "query": {
    "term": {
      "onelevel": "手机通讯"
    }
  },
  "aggs": {
    "czbk": {
      "min": {
        "field": "price"
      }
    }
  }
}

结果:"value": 0.0

参数size=1;可查询出金额为0的数据

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 1,
        "query": {
            "term": {
                "onelevel": "手机通讯"
            }
        },
        "aggs": {
            "czbk": {
                "min": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

        //最小值
        else if (m.getValue() instanceof ParsedMin) {
            map.put("value", ((ParsedMin) m.getValue()).getValue());
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

4、Sum(总和)

统计所有文档汇总

POST product_list_info/_search
{
  "size": 0, 
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "threelevel": "手机"
        }
      }
    }
  },
  "aggs": {
    "czbk": {
      "sum": {
        "field": "price"
      }
    }
  }
}

 

结果:"value" : 3.433611809E7

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "sum": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

 //汇总
 if (m.getValue() instanceof ParsedSum) {
            map.put("value", ((ParsedSum) m.getValue()).getValue());
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

5、 Cardinality(唯一值)

Cardinality Aggregation,基数聚合。它属于multi-value,基于文档的某个值(可以是特定的字段,也可以通过脚本计算而来),计算文档非重复的个数(去重计数),相当于sql中的distinct。

cardinality 求唯一值,即不重复的字段有多少(相当于mysql中的distinct)

统计所有文档

POST product_list_info/_search
{
  "size": 0, 
  "aggs": {
    "czbk": {
      "cardinality": {
        "field": "storename"
      }
    }
  }
}

结果:"value" : 103169

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "cardinality": {
                    "field": "storename"
                }
            }
        }
    }
}

统计筛选后的文档

POST product_list_info/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "threelevel": "手机"
        }
      }
    }
  },
  "aggs": {
    "czbk": {
      "cardinality": {
        "field": "storename"
      }
    }
  }
}

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "cardinality": {
                    "field": "storename"
                }
            }
        }
    }
}

代码编写

if (m.getValue() instanceof ParsedCardinality) {
            map.put("value", ((ParsedCardinality) m.getValue()).getValue());
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

1.2.3 多值分析API设计

1、Stats Aggregation

Stats Aggregation,统计聚合。它属于multi-value,基于文档的某个值(可以是特定的数值型字段,也可以通过脚本计算而来),计算出一些统计信息(min、max、sum、count、avg5个值)

统计所有文档

POST product_list_info/_search
{
  "size": 0, 
  "aggs": {
    "czbk": {
      "stats": {
        "field": "price"
      }
    }
  }
}

返回


  "aggregations" : {
    "czbk" : {
      "count" : 5072447,
      "min" : 0.0,
      "max" : 9.9999999E7,
      "avg" : 920.1537270512633,
      "sum" : 4.66743101232E9
 

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "stats": {
                    "field": "price"
                }
            }
        }
    }
}

统计筛选文档

POST product_list_info/_search
{
  "size": 0, 
     "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
  "aggs": {
    "czbk": {
      "stats": {
        "field": "price"
      }
    }
  }
}

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "stats": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

 else if (m.getValue() instanceof ParsedStats) {
            map.put("count", ((ParsedStats) m.getValue()).getCount());
            map.put("min", ((ParsedStats) m.getValue()).getMin());
            map.put("max", ((ParsedStats) m.getValue()).getMax());
            map.put("avg", ((ParsedStats) m.getValue()).getAvg());
            map.put("sum", ((ParsedStats) m.getValue()).getSum());
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

2、扩展状态统计

Extended Stats Aggregation,扩展统计聚合。它属于multi-value,比stats多4个统计结果: 平方和、方差、标准差、平均值加/减两个标准差的区间

统计所有文档

POST product_list_info/_search
{
  "size": 0, 
  "aggs": {
    "czbk": {
      "extended_stats": {
        "field": "price"
      }
    }
  }
}

返回

aggregations" : {
    "czbk" : {
      "count" : 5072447,
      "min" : 0.0,
      "max" : 9.9999999E7,
      "avg" : 920.1537270512633,
      "sum" : 4.66743101232E9,
      "sum_of_squares" : 2.0182209054045464E16,
      "variance" : 3.9779448262354884E9,
      "std_deviation" : 63070.950731977144,
      "std_deviation_bounds" : {
        "upper" : 127062.05519100555,
        "lower" : -125221.74773690302
      }

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "extended_stats": {
                    "field": "price"
                }
            }
        }
    }
}

统计筛选后的文档

POST product_list_info/_search
{
  "size": 1,
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "threelevel": "手机"
        }
      }
    }
  },
  "aggs": {
    "czbk": {
      "extended_stats": {
        "field": "price"
      }
    }
  }
}

aggregations" : {
    "czbk" : {
      "count" : 12402,
      "min" : 0.0,
      "max" : 2474000.0,
      "avg" : 2768.595233833253,
      "sum" : 3.433611809E7,
      "sum_of_squares" : 6.445447222627729E12,
      "variance" : 5.120451870452684E8,
      "std_deviation" : 22628.41547800615,
      "std_deviation_bounds" : {
        "upper" : 48025.42618984555,
        "lower" : -42488.23572217905

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 1,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "extended_stats": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

状态统计ParsedStats是扩展状态统计ParsedExtendedStats父类

判断的时候将ParsedExtendedStats放到前面

    //扩展状态统计
        else if (m.getValue() instanceof ParsedExtendedStats) {
            map.put("count", ((ParsedStats) m.getValue()).getCount());
            map.put("min", ((ParsedStats) m.getValue()).getMin());
            map.put("max", ((ParsedStats) m.getValue()).getMax());
            map.put("avg", ((ParsedStats) m.getValue()).getAvg());
            map.put("sum", ((ParsedStats) m.getValue()).getSum());
            map.put("sum_of_squares", ((ParsedExtendedStats) m.getValue()).getSumOfSquares());
            map.put("variance", ((ParsedExtendedStats) m.getValue()).getVariance());
            map.put("std_deviation", ((ParsedExtendedStats) m.getValue()).getStdDeviation());
            map.put("lower", ((ParsedExtendedStats) m.getValue()).getStdDeviationBound(ExtendedStats.Bounds.LOWER));
            map.put("upper", ((ParsedExtendedStats) m.getValue()).getStdDeviationBound(ExtendedStats.Bounds.UPPER));
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

3、百分位度量/百分比统计

Percentiles Aggregation,百分比聚合。它属于multi-value,对指定字段(脚本)的值按从小到大累计每个值对应的文档数的占比(占所有命中文档数的百分比),返回指定占比比例对应的值。默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值。

它们表示了人们感兴趣的常用百分位数值。

统计所有文档

POST product_list_info/_search
{
  "size": 0,
  "aggs": {
    "czbk": {
      "percentiles": {
        "field": "price"
      }
    }
  }
}

返回

aggregations" : {
    "czbk" : {
      "values" : {
        "1.0" : 0.0,
        "5.0" : 15.021825109603165,
        "25.0" : 58.669333121791,
        "50.0" : 139.7398105623917,
        "75.0" : 388.2363222057536,
        "95.0" : 3630.78148822216,
        "99.0" : 12561.562823894474
      }
    }

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "percentiles": {
                    "field": "price"
                }
            }
        }
    }
}

统计筛选后的文档

POST product_list_info/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "threelevel": "手机"
        }
      }
    }
  },
  "aggs": {
    "czbk": {
      "percentiles": {
        "field": "price"
      }
    }
  }
}

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "percentiles": {
                    "field": "price"
                }
            }
        }
    }
}

代码编写

 else if (m.getValue() instanceof ParsedTDigestPercentiles) {
            for (Iterator<Percentile> iterator = ((ParsedTDigestPercentiles) m.getValue()).iterator(); iterator.hasNext(); ) {
                Percentile p = (Percentile) iterator.next();
                map.put(p.getValue(), p.getPercent());

            }
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

4、百分位等级/百分比排名聚合

百分比排名聚合:这里有另外一个紧密相关的度量叫 percentile_rankspercentiles 度量告诉我们落在某个百分比以下的所有文档的最小值。

背景介绍
percentile_ranks常用作SLA的统计

SLA: Service-Level Agreement的缩写,意思是服务等级协议;衡量服务的一个标准

比如;网站访问延时SLA统计, 大公司内,一般都是要求100%的请求在200ms以内完成响应
如果超过1s,则需要升级到A级故障,代表网站的访问性能和用户体验急剧下降

比如说,我们可以统计下我们的调用链路数据;举个例子,比如说
在200ms以内的,有百分之多少请求通过
在1000毫秒以内的有百分之多少的请求通过


统计所有文档

统计价格在15元之内统计价格在30元之内文档数据占有的百分比

tips:

统计数据会变化

这里的15和30;完全可以理解万SLA的200;比较字段不一样而已

 
POST product_list_info/_search
{
  "size": 0,
  "aggs": {
    "czbk": {
      "percentile_ranks": {
        "field": "price",
        "values": [
          15,
          30
        ]
      }
    }
  }
}

返回

价格在15元之内的文档数据占比是4.92%

价格在30元之内的文档数据占比是12.72%

aggregations" : {
    "czbk" : {
      "values" : {
        "15.0" : 4.92128378837021,
        "30.0" : 12.724827959646579
      }
    }
  }

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "aggs": {
            "czbk": {
                "percentile_ranks": {
                    "field": "price",
                    "values": [
                        15,
                        30
                    ]
                }
            }
        }
    }
}

统计过滤后的文档

 
POST product_list_info/_search
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "threelevel": "手机"
        }
      }
    }
  },
  "aggs": {
    "czbk": {
      "percentile_ranks": {
        "field": "price",
        "values": [
          15,
          30
        ]
      }
    }
  }
}

OpenAPI查询参数设计

{
    "indexName": "product_list_info",
    "map": {
        "size": 0,
        "query": {
            "constant_score": {
                "filter": {
                    "match": {
                        "threelevel": "手机"
                    }
                }
            }
        },
        "aggs": {
            "czbk": {
                "percentile_ranks": {
                    "field": "price",
                    "values": [
                        15,
                        30
                    ]
                }
            }
        }
    }
}

代码编写

    //百分位等级
        else if (m.getValue() instanceof ParsedTDigestPercentileRanks) {
            for (Iterator<Percentile> iterator = ((ParsedTDigestPercentileRanks) m.getValue()).iterator(); iterator.hasNext(); ) {
                Percentile p = (Percentile) iterator.next();
                map.put(p.getValue(), p.getPercent());
            }
        }

访问验证

http://172.17.0.225:6666/v1/analysis/metric/agg
OR
http://localhost:5555/v1/analysis/metric/agg

正常的API编写

avgMetricAgg

1.2.4 分析服务发布

1、设置Dockfile文件

#指定基础镜像,必须为第一个命令这里使用openjdk的基础镜像
FROM openjdk:11
#MAINTAINER: 维护者信息,这里是维护者是itheima
MAINTAINER  itheima
#VOLUME:用于指定持久化目录,挂载镜像
VOLUME /itheima
#将本地文件添加到容器中,这里是从target下复制itheima-service-analysis-1.0.0-SNAPSHOT.jar到根目录
ADD itheima-service-analysis-1.0.0-SNAPSHOT.jar  app.jar
#RUN:构建镜像时执行的命令,这里是设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 5555
#ENV:设置环境变量
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=pro","-jar","/app.jar"]

2、启动

docker run  --name service-analysis  --net czbkNetwork --ip 172.188.0.34 --privileged=true  -p 5555:5555  --restart=always  -d itheima-service-analysis:1.0.0.RELEASE

3)访问地址

http://172.17.0.225:6666/v1/analysis/metric/agg

写在后面:
技术中台下终搜技术解决方案 课程合计分为三天
持续更新

  • 第一天内容介绍

ps:当前页面为第一天的【第一章节】

  • 第二天内容介绍:

  • 第三天内容介绍:

标签:map,product,day03,list,技术,aggs,台下,czbk,size
来源: https://www.cnblogs.com/xingpu/p/14037716.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有