Elasticsearch 学习笔记Day 09

114 阅读4分钟

hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!


  • 起始标记->Elasticsearch入门(15讲):「21 | 基本概念:Index Template和Dynamic Template」
  • 结尾标记->Elasticsearch入门(15讲):「22 | 基本概念:Elasticsearch聚合分析简介」

Index Template和Dynamic Template

什么是 Index Template

  • Index Templates -帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到新创建的索引之上
    • 模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引
    • 你可以设定多个索引模版,这些设置会被“merge"在一起
    • 你可以指定“order”的数值,控制“merging'的过程

两个 Index Templates

image.png image.png

Index Template 的工作方式

  • 当一个索引被新创建时
    • 应用Elasticsearch默认的settings 和 mappings
    • 应用order数值低的Index Template 中的设定
    • 应用order高的Index Template 中的设定,之前的设定会被覆盖
    • 引用创建索引时,用户指定的Settings和Mappings,并覆盖之前模板中的设定

什么是 Dynamic Template

  • 根据Elasticsearch识别的数据类型,结合字段名称,来动态设定字段类型
    • 所有的字符串类型都设定成keyword。或者关闭keyword字段
    • is开头的字段都设置成boolean
    • long_开头的都设置成long类型

Dynamic Template

image.png

  • Dynamic Tempate是定义在在某个索引的Mapping中
  • Template有一个名称
  • 匹配规则是一个数组
  • 为匹配到字段设置Mapping

CodeDemo

#数字字符串被映射成text,日期字符串被映射成日期 PUT ttemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } GET ttemplate/_mapping

#Create a default template PUT _template/template_default { "index_patterns": ["*"], "order" : 0, "version": 1, "settings": { "number_of_shards": 1, "number_of_replicas":1 } }

PUT /_template/template_test { "index_patterns" : ["test*"], "order" : 1, "settings" : { "number_of_shards": 1, "number_of_replicas" : 2 }, "mappings" : { "date_detection": false, "numeric_detection": true } }

#查看template信息 GET /_template/template_default GET /_template/temp*

#写入新的数据,index以test开头 PUT testtemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } GET testtemplate/_mapping get testtemplate/_settings

PUT testmy { "settings":{ "number_of_replicas":5 } }

put testmy/_doc/1 { "key":"value" }

get testmy/_settings DELETE testmy DELETE /_template/template_default DELETE /_template/template_test

#Dynaminc Mapping 根据类型和字段名 DELETE my_index

PUT my_index/_doc/1 { "firstName":"Ruan", "isVIP":"true" }

GET my_index/_mapping DELETE my_index PUT my_index { "mappings": { "dynamic_templates": [ { "strings_as_boolean": { "match_mapping_type": "string", "match":"is*", "mapping": { "type": "boolean" } } }, { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] } }

DELETE my_index #结合路径 PUT my_index { "mappings": { "dynamic_templates": [ { "full_name": { "path_match": "name.", "path_unmatch": ".middle", "mapping": { "type": "text", "copy_to": "full_name" } } } ] } }

PUT my_index/_doc/1 { "name": { "first": "John", "middle": "Winston", "last": "Lennon" } }

GET my_index/_search?q=full_name:John

相关阅读

Elasticsearch聚合分析简介

什么是聚合(Aggregation)

  • Elasticsearch 除搜索以外,提供的针对ES数据进行统计分析的功能
    • 实时性高
    • Hadoop (T+1)
  • 通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档
    • 尖沙咀和香港岛的客房数量
    • 不同的价格区间,可预定的经济型酒店和五星级酒店的数量
  • 高性能,只需要一条语句,就可以从Elasticsearch得到分析结果
    • 无需在客户端自 己去实现分析逻辑

Kibana 可视化报表 - 聚合分析 image.png

  • 公司程序员的工作岗位分布
  • 公司采用的编程框架分布
  • 公司员工薪水分布
  • 客户的地理位置分布
  • 订单的增长情况
  • 等等.....

集合的分类

  • Bucket Aggregation - 一些列满足特定条件的文档的集合
  • Metric Aggregation - 一些数学运算,可以对文档字段进行统计分析
  • Pipeline Aggregation - 对其他的聚合结果进行二次聚合
  • Matrix Aggregration - 支持对多个字段的操作并提供一个结果矩阵

Bucket & Metric

image.png

Bucket

image.png

  • 一些例子
    • 杭州属于浙江/一个演员属于 男或女性
    • 嵌套关系-杭州属于浙江属于中国属于亚洲
  • Elasticsearch提供了很多类型的Bucket,帮助你用多种方式划分文档
    • Term&Range(时间/年龄区间/地理位置)

Metric

  • Metric会基于数据集计算结果,除了支持在字段上进行计算,同样也支持在脚本(painless script)产生的结果之,上进行计算
  • 大多数Metric是数学计算,仅输出一个值
    • min / max / sum / avg / cardinality
  • 部分metric 支持输出多个数值
    • stats / percentiles / percentile_ ranks

一个Bucket的例子image.png

加入Metrics

查看航班目的地的统计信息,增加均价,最高最低价格 image.pngimage.png

嵌套

查看航班目的地的统计信息,平均票价,以及天气状况image.pngimage.png

CodeDemo

#按照目的地进行分桶统计 GET kibana_sample_data_flights/_search { "size": 0, "aggs":{ "flight_dest":{ "terms":{ "field":"DestCountry" } } } }

#查看航班目的地的统计信息,增加平均,最高最低价格 GET kibana_sample_data_flights/_search { "size": 0, "aggs":{ "flight_dest":{ "terms":{ "field":"DestCountry" }, "aggs":{ "avg_price":{ "avg":{ "field":"AvgTicketPrice" } }, "max_price":{ "max":{ "field":"AvgTicketPrice" } }, "min_price":{ "min":{ "field":"AvgTicketPrice" } } } } } }

#价格统计信息+天气信息 GET kibana_sample_data_flights/_search { "size": 0, "aggs":{ "flight_dest":{ "terms":{ "field":"DestCountry" }, "aggs":{ "stats_price":{ "stats":{ "field":"AvgTicketPrice" } }, "wather":{ "terms": { "field": "DestWeather", "size": 5 } }

  	}
  }

} }

相关阅读

www.elastic.co/guide/en/el…

总结


学习了Index Template 和 Dynamic Template 可以更加灵活的为索引创建mapping

此文章为3月Day1学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》