zoukankan      html  css  js  c++  java
  • Elasticsearch基础但非常有用的功能之二:模板

    文章转载自:
    https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484584&idx=1&sn=accfb65830255f00c28ac1571725e493&chksm=eaa82c80dddfa596bef19161d713fe935142eda894f11d065a38495cd3e7ec59157403c5393f&scene=21#wechat_redirect

    1、 引言
    业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创建都很麻烦! 怎么破?
    业务场景2:实际业务多个索引,想让多个索引中的相同名字的字段类型完全一致,以便实现跨索引检索。怎么破?

    思考上面两个问题,当单Mapping不能解决多索引问题时,模板的作用就体现出来了。
    下文中:模板=template,映射=Mapping。
    2、Elasticsearch模板是什么鬼?
    【维基百科】模板:或称样板、范本,通常指具有固定内容、可构建多个不同实例的可重用样板。
    Elasticsearch索引template指:在创建新索引时将自动套用的模板。
    直接上样例,一探究竟。

    1 PUT _template/template_1
    2{
    3 "index_patterns": ["te", "bar"],
    4 "aliases" : {
    5 "alias1" : {}}
    6 "settings": {
    7 "number_of_shards": 1
    8 },
    9 "mappings": {
    10 "_source": {
    11 "enabled": false
    12 },
    13 "properties": {
    14 "host_name": {
    15 "type": "keyword"
    16 },
    17 "created_at": {
    18 "type": "date",
    19 "format": "EEE MMM dd HH:mm:ss Z yyyy"
    20 }
    21 }
    22 }
    23}

    其中:
    index_patterns代表匹配的索引。
    settings 指索引层面的设置。
    可以设置索引层面的配置,包括:

    分片数(number_of_shards)、
    
    副本数(number_of_replicas)、
    
    刷新频率(refresh_interval)
    
    …..
    

    mappings:字段映射。
    aliases:指定索引的别名。
    别名的妙处参考:Elasticsearch基础但非常有用的功能之一:别名
    3、Elasticsearch模板的基础操作
    3.1 增

    1PUT _template/template_1
    2...

    如第二节的示例。
    3.2 删

    1DELETE /_template/template_1

    3.3 改
    直接执行3.1的创建模板操作,会生成相同名称的新的模板,并会覆盖掉原来创建的模板。
    新模板只对新创建的索引生效,对历史索引不起作用。
    3.4 查

    1GET /_template/template_1

    4、Elasticsearch模板进阶实战
    当template和Mapping的dynamic_templates结合就相当于放了大招。
    直接拿个实战例子说明问题。
    需求1:默认如果不显示指定Mapping,数值类型的值会被映射会long类型,但实际业务数值都比较小,会有存储浪费。需要将默认值改成integer。
    需求2:date_*开头的字符统一匹配为date日期类型。
    实战如下:

    1PUT sampleindex/_doc/1
    2{
    3 "Value":123
    4}
    5
    6GET sampleindex/_mapping
    7
    8
    9PUT template/sample_dynamic_template
    10{
    11 "index_patterns": [
    12 "sample*"
    13 ],
    14 "mappings": {
    15 "dynamic_templates": [
    16 {
    17 "handle_integers": {
    18 "match_mapping_type": "long",
    19 "mapping": {
    20 "type": "integer"
    21 }
    22 }
    23 },
    24 {
    25 "handle_date": {
    26 "match": "date
    ",
    27 "unmatch": "
    _text",
    28 "mapping": {
    29 "type": "date"
    30 }
    31 }
    32 }
    33 ]
    34 }
    35}
    36
    37DELETE sampleindex
    38PUT sampleindex/_doc/1
    39{
    40 "Value":123,
    41 "date_curtime":"1574494620000"
    42}
    43
    44GET sampleindex/_mapping

    index_patterns:对应待匹配的以”sample开头的“索引。
    handle_integers:动态模板的名字,你可以自己定义。
    match_mapping_type:被匹配的被重写的源数据类型。
    match/unmatch:匹配字段类型。
    

    整个操作的核心是:将默认的long改成integer,date_*开头匹配为date类型。
    更多分类如下:
    核心参见:
    https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
    不再赘述。
    5、常见问题
    问题1:template和Mapping到底什么区别?

    Mapping:
    针对单一索引。
    类似Mysql中的表结构定义,是所有数据存储到该索引的架构定义。
    字段支持:1)静态明确定义、2)系统层面自动识别、3)动态匹配。
    template:
    针对一个或多个索引。
    除了定义Mapping的全支持外,还可以指定Setting、别名等。
    适合数据量大、灵活多变的业务场景。
    

    问题2:模板里可以指定Mapping,那我们还需要Mapping做什么?

    索引模板对于在多个索引创建映射时非常有用。
    如果数据量少,业务场景单一,那只Mapping也能解决问题。
    

    问题3:如果我想更新Mapping,更新模板可以吗?
    认知前提:Mapping一旦创建了,不能修改。除非进行reindex操作。

    一旦创建了索引,对索引模板的更新将不会影响该索引。更新模板仅适用于新索引。
    同样,更新为dynamic_templates仅会影响索引中的新字段。
    

    问题4:模板order起到什么作用?
    拿星球同学实战例子举例一下:
    问题:我现在想创建2个template,其中模板B-template有副本设置,另外一个A-template没有副本设置,我可以这样配置吗?

    其中B-template匹配到我单独设置的几个索引("logstash-B-tomcat-","logstash-B1-tomcat-","logstash-B2-server-*","logstash-B3-tomcat"),
    另外A-template匹配所有,我设置B-template的order比A-template高,是不是我那4个索引就会匹配到B-template呢?
    

    正确写法参考:

    1PUT _template/b-template
    2{
    3 "order":1,
    4 "index_patterns":["logstash-b-tomcat-","logstash-b1-tomcat-","logstash-b2-server-","logstash-b3-tomcat-"],
    5 "settings":{
    6 "number_of_shards":"5",
    7 "number_of_replicas":"1",
    8 "refresh_interval":"30s",
    9 "translog.durability":"async"
    10 }
    11}
    12
    13PUT logstash-b-tomcat-1
    14
    15PUT _template/a-template
    16{
    17 "order":0,
    18 "index_patterns":["*"],
    19 "settings":{
    20 "number_of_shards":"5",
    21 "number_of_replicas":"0",
    22 "refresh_interval":"30s",
    23 "translog.durability":"async"
    24 }
    25}

    核心原理:order高会覆盖order低的模板。
    6、小结
    实战中,你会发现:template是高效的的工具,可全局设置多个索引且批量生效,避免的不必要的返工。
    相比之下Mapping和别名优势如下:

    Mapping有助于我们保持数据库结构的一致性,并为我们提供Elasticsearch丰富的数据类型以及更复杂的自定义Mapping和分析类型。
    别名Alias对于最大限度地无需停服完成索引切换起到重要作用。
    

    因此,当我们新系统准备选型Elasticsearch作为核心数据存储时,优先注意数据建模;数据建模的过程中要整合template、alias和mapping的综合优势,才能保证模型的健壮性。

  • 相关阅读:
    C++互斥器:Semaphores
    C++互斥器:Mutex
    内联函数(inline)
    C++显式转换
    线程同步控制
    拷贝构造函数——防篡改
    extern关键字
    虚析构、纯虚析构
    类的友元关系
    char 与 unsigned char的本质区别
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/12877813.html
Copyright © 2011-2022 走看看