希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 Elasticsearch索引管理 丁D 学无止境 2020-05-21 10:57 39931已阅读 摘要本文将介绍es的索引模板、reindex及根据日期滚动rollover api,及索引的别名 查看所有的索引 GET _cat/indices 查看所有的别名 GET 127.0.0.1:9200/_alias 查看的模板 GET 127.0.0.1:9200/_template/模板名 使用通配符 GET /_template/temp* ### 一、重建索引 从前面的学习中,我们知道es的字段建立后就不能被修改,假设原本是一个string类型的数据,被识别成date类型,之后再传一个string类型,由于无法转换格式就报错。。这个时候我们的做法就只能加一个字段去处理,,久而久之字段太多了。。就不行了 所以我们只能重建索引。。。reindex **注意点** 1、**重建索引不会尝试设置目标索引,它不会复制源索引的设置,你应该在运行_reindex操作之前设置目标索引,包括设置映射、碎片数、副本等**。 2、一般不会冲突,除非将多个index 重建到同一个index,这样id才有可能冲突,,**默认是覆盖**。可以自己设置 3、重建索引,是指重建索引那个时候的**一个快照**,比如重建索引过程需要1分钟。。在重建索引的过程中,插入旧索引的数据是不会同步过去的。所以是否可以在重建索引的时候将旧的索引设置成**只读**状态? ``` POST _reindex { "source": { "index": "my_index_name" }, "dest": { "index": "my_index_name_new" } } ``` **_source 重建特定的字段** 有时候我们有写字段不用了同步到新的索引 只有满足_source的字段才会被同步到新的索引 ``` POST _reindex { "source": { "index": "my_index_name", "_source": ["field_name_1", "field_name_2"] }, "dest": { "index": "my_index_name_new" } } ``` 以下会在copy后将**新索引中的flag字段名称修改为tag:** ``` POST _reindex { "source": { "index": "test" }, "dest": { "index": "test2" }, "script": { "source": "ctx._source.tag = ctx._source.remove(\"flag\")" } } ``` **对满足query条件的数据进行同步** ``` POST _reindex { "source": { "index": "my_index_name", "type": "my_type_name", "query": { // query的条件 "term": { "user": "user_value" } } }, "dest": { "index": "my_index_name_new" } } ``` **reindex太慢优化** reindex底层是使用scroll滚动去同步的,,这个是快照 **1、修改批量条数** 默认情况下,_reindex使用1000条进行批量操作,但是我们在之前学过一个好的bulk是5M-15M,而不是看文档数量 1)每个1kb的1000个文档是1mb。 2)每个100kb的1000个文档是100 MB。 ``` POST _reindex { "source": { "index": "source", "size": 5000 }, "dest": { "index": "dest", "routing": "=cat" } } ``` **2、借助scroll的sliced** ``` POST _reindex?slices=5&refresh { "source": { "index": "twitter" }, "dest": { "index": "new_twitter" } } ``` >slices大小设置注意事项: 1)slices大小的设置可以手动指定,或者设置slices设置为auto,auto的含义是:针对单索引,slices大小=分片数;针对多索引,slices=分片的最小值。 >2)当slices的数量等于索引中的分片数量时,查询性能最高效。slices大小大于分片数,非但不会提升效率,反而会增加开销。 >3)如果这个slices数字很大(例如500),建议选择一个较低的数字,因为过大的slices 会影响性能。 **3、将ES副本数设置为0** 如果要进行大量批量导入,请考虑通过设置index.number_of_replicas来禁用副本:0,等同步完成在启用副本。 复制文档时,将整个文档发送到副本节点,并逐字重复索引过程。 这意味着每个副本都将执行分析,索引和潜在合并过程。 相反,如果您使用零副本进行索引,然后在提取完成时启用副本,则恢复过程本质上是逐字节的网络传输。 这比复制索引过程更有效。 ``` PUT /my_logs/_settings { "number_of_replicas": 1 } ``` **4、增加refresh间隔** 如果你的搜索结果不需要接近实时的准确性,考虑先不要急于索引刷新refresh。可以将每个索引的refresh_interval到30s。 如果正在进行大量数据导入,可以通过在导入期间将此值设置为-1来禁用刷新。完成后不要忘记重新启用它! 设置方法: ``` PUT /my_logs/_settings { "refresh_interval": -1 } ``` ### 二、索引别名 像上面我们将一个旧的索引 order_index_v1 重建到 order_index_v2的时候 我们java代码查询es的时候使用order_index_v1,这样的话,当我们要切换使用order_index_v2,就需要将所有的order_index_v1改成order_index_v2,麻烦,而且java服务可能需要停机重启才能生效,这样肯定是不行的,所以我们就可以使用别名 我们将order_index_v1 取一个别名叫order_index,,之后对order_index_v1的操作都使用order_index,当我们切换索引的时候将,别名指向order_index_v2就行,, **别名在rollover的时候非常好用,,而且索引对性能没有任何影响** **新建别名** order_index别名指向已有的索引order_index_v1 ``` POST /_aliases?pretty { "actions": [ { "add": { "index": "order_index_v1", "alias": "order_index" } } ] } ``` **索引切换** 将order_index指向order_index_v2 ``` POST /_aliases?pretty { "actions": [ { "remove": { "index": "order_index_v1", "alias": "order_index" } }, { "add": { "index": "order_index_v2", "alias": "order_index" } } ] } ``` ### 三、索引模板 ```yaml { "order": 0, // 模板优先级 "template": "sample_info*", // 模板匹配的名称方式 "settings": {...}, // 索引设置 "mappings": {...}, // 索引中各字段的映射定义 "aliases": {...} // 索引的别名 } ``` order:优先级数字越低,越早使用,如果同时匹配到两个模板,数字低的先使用,数字高的会覆盖低的。 template:将这个模板应用于所有以 logstash- 为起始的索引。 settings:定义了索引的属性,包括分片数量、副本数量、写入flush时间间隔。 mappings:字段映射 aliases:别名 ``` "settings": { "index": { "refresh_interval": "10s",//每10秒刷新 "number_of_shards" : "5",//主分片数量 "number_of_replicas" : "2",//副本数量 "translog": { "flush_threshold_size": "1gb",//内容容量到达1gb异步刷新 "sync_interval": "30s",//间隔30s异步刷新(设置后无法更改) "durability": "async"//异步刷新 } } } ``` **创建模板** (模板名和索引名一样都不能有大写) ``` PUT http://127.0.0.1:9200/_template/template_name { "template": "dsideal*", "order": 0, "settings": { "number_of_shards": 5 }, "aliases": { "dsideal-query": {} #起个别名 }, "mappings": { "doc": { "properties": { "person_name": { "type": "keyword" }, "gender_id": { "type": "long" }, "bureau_id": { "type": "long" } } } } } ``` **blog的例子** 先创建一个模板 ``` put 127.0.0.1:9200/_template/blog_template { "template": "blog_*", "order": 0, "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "doc": { "properties": { "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "summary": { "type": "text" }, "publish_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis" }, "states": { "type": "short" }, "creator": { "type": "keyword" }, "click_num": { "type": "integer" }, "thumb_url": { "type": "text" }, "category_id": { "type": "long" }, "join_field": { "type": "join", "relations": { "t_article": "t_article_contents" } }, "contents": { "type": "text" } } } } } ``` 创建一个索引 blog_v3 会自动使用模板 ``` put 127.0.0.1:9200/blog_v3/ ``` 重建索引 注意上面模板的type doc 源数据是 t_article 所以reindex 要指定同步到doc ``` { "source": { "index": "blog" }, "dest": { "index": "blog_v3", "type":"doc" } } ``` >注意 假设 我有5条数据 第二条reindex失败了 但是(其他的数据会成功),不会因为一条数据失败而全部失败,,但是继续重建的时候会被默认覆盖,所以不用删除 ``` 遇到一个问题 我的模板设置日期格式 "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 但是我源数据的格式 yyyy-MM-dd HH:mm 同步的时候会因为格式不正确报错 后面我将模板改成 "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis" 重新同步 发现还是不行,,,这个是因为你只是改了模板,,但是对已经创建的index不生效了。。 ``` ### 四、rollover api 如果所有数据只存在一个索引下,随着数据积累,索引体积越来越大。为了方便管理ES索引,尽量将数据分散到多个索引里。在ES5.0以后新增了一个rollover API,可以动态的滚动索引。 满足条件的时候会自动触发,滚动创建新的索引。。 ``` { "conditions": { "max_age": "30d", "max_docs": 1000, "max_size": "50gb", } } 当满足30天 或者 这个index文档数量大于1000 或者数据总量大于50gb 满足一个会自动滚动创建新的index ``` 有两种指定新index名字的方式 1、第一种不指定索引名字 索引名字需要以-数字结尾 例如: index_name-1。每次调用rollover API新的索引名字会自动+1 假设我们现在有一个别名blog_alias指向blog-8 ``` POST 127.0.0.1:9200/blog_alias(别名)/_rollover { "conditions": { "max_age": "7d", "max_docs": 1400, "max_size": "5gb" } } ``` 滚动index的index为blog-000009**(6位)** 2、第二种自己指定索引名字 ``` POST 127.0.0.1:9200/blog_alias(别名)/_rollover/%3Cblog_alias-%7Bnow%2Fd%7D-1%3E { "conditions": { "max_age": "7d", "max_docs": 1400, "max_size": "5gb" } } 格式就是 https://www.urlencoder.io/。实际上它就是字符串“”的url编码形式 ``` >ps 创建别名的时候 要是使用**"is_write_index": true**这样我们每次通过别名进行写操作才能指向最新的index rollover不会自动触发,我们需要写个定时器去调用,,比如0点0分0秒去触发 max_age如果是中午12点创建的index 是从中午还是算的时间24小时为一天。。如"max_age": "1d",到隔开中午12点算一天 ### 五、源数据 ``` { "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": 1, "hits": [ { "_index": "blog", "_type": "t_article", "_id": "31111111111111111", "_score": 1, "_routing": "29", "_source": { "contents": "娃哈哈哈哈哈哈哈哈", "join_field": { "name": "t_article_contents", "parent": 1 } } }, { "_index": "blog", "_type": "t_article", "_id": "2", "_score": 1, "_source": { "title": "你大爷", "summary": "你大爷 哇哈哈 66666", "publish_time": "2018-08-29 15:56", "states": 1, "creator": "丁D", "click_num": 222, "thumb_url": "/upload/shan.jpg", "category_id": 1, "join_field": { "name": "t_article" } } }, { "_index": "blog", "_type": "t_article", "_id": "3", "_score": 1, "_routing": "1", "_source": { "contents": "娃哈哈哈哈哈哈哈哈", "join_field": { "name": "t_article_contents", "parent": 1 } } }, { "_index": "blog", "_type": "t_article", "_id": "4", "_score": 1, "_routing": "1", "_source": { "contents": "沿着路灯一个人走回家 和老朋友打电话 你那里天气好吗", "join_field": { "name": "t_article_contents", "parent": 1 } } }, { "_index": "blog", "_type": "t_article", "_id": "1", "_score": 1, "_source": { "title": "山有木兮", "summary": "《山有木兮》是橙光游戏《人鱼传说之长生烛》的主题曲,执素兮谱曲,顾聆落填词演唱者伦桑,于2016年8月12日正式发行", "publish_time": "2018-08-29 15:56:00", "category_id": 1, "states": 1, "creator": "丁D", "click_num": 111, "thumb_url": "/upload/shan.jpg", "join_field": { "name": "t_article" } } } ] } } ``` 很赞哦! (0) 上一篇:CAS+Springboot单点登录 下一篇:MYSQL-连续登陆的天数 目录 点击排行 redis哨兵 Elasticsearch6.3.2之x-pack 2019-09-24 11:12 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 JVM垃圾回收器 2019-10-10 10:23 GC优化策略和相关实践案例 2019-10-10 10:54 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡