searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

重新索引增加ES中已存在索引的时间划分

2024-12-12 09:10:55
8
0
  1. 重新索引(Reindex)结合索引模板
    • 原理
      • 重新索引是将现有索引中的数据复制到一个新的索引结构中的过程。首先需要创建一个带有时间划分功能的索引模板,然后通过重新索引操作将旧索引中的数据按照新的时间划分规则迁移到新索引中。
    • 步骤
      • 创建索引模板
        • 假设要按照天来划分时间,并且有一个名为existing_index的现有索引,数据中有@timestamp字段记录时间信息。首先创建一个索引模板,示例如下:
         PUT _template/template_with_time
         {
           "index_patterns": ["new_index_prefix - *"],
           "settings": {
             "number_of_shards": 1,
             "number_of_replicas": 0
           },
           "mappings": {
             "properties": {
               "@timestamp": {
                 "type": "date"
               }
             }
           },
           "date_matching_pattern": "yyyy.MM.dd",
           "date_histogram_interval": "1d"
         }
  • 这里的index_patterns定义了新索引的名称模式为new_index_prefix - *date_matching_patterndate_histogram_interval分别定义了日期匹配格式和时间间隔(按天划分)。
  • 执行重新索引操作
    • 使用 Elasticsearch 的_reindex API 来将数据从现有索引迁移到新索引。假设现有索引为existing_index,新索引根据日期格式生成(例如,new_index_prefix - 2024.12.03),@timestamp字段为日期字段,操作如下:
 
         POST _reindex
         {
           "source": {
             "index": "existing_index"
           },
           "dest": {
             "index": "new_index_prefix - %{+yyyy.MM.dd}"
           },
           "script": {
             "inline": "ctx._index = 'new_index_prefix - ' + ctx._source['@timestamp'].format('yyyy.MM.dd')",
             "lang": "painless"
           }
         }
  • 在这个_reindex操作中,source部分指定了数据来源的索引(existing_index),dest部分指定了目标索引的格式(new_index_prefix - %{+yyyy.MM.dd}),script部分的脚本用于根据@timestamp字段的值来确定每个文档应该被迁移到哪个具体日期的新索引中。
  1. 修改现有索引的映射和别名(Alias)设置(部分情况适用)
    • 原理
      • 如果现有的索引结构允许,并且时间划分的方式比较简单(例如,只是添加一个基于时间的别名来模拟时间划分),可以通过修改索引的映射和别名来实现时间划分的效果。
    • 步骤
      • 添加日期字段映射(如果不存在)
        • 首先检查现有索引的映射,看看是否已经有合适的日期字段。如果没有,需要添加日期字段映射。假设使用KibanaDev Tools来操作,对于现有索引existing_index,如果要添加@timestamp字段的映射,操作如下:
 
         PUT existing_index/_mapping
         {
           "properties": {
             "@timestamp": {
               "type": "date"
             }
           }
         }
  • 创建时间划分的别名
    • 根据日期条件为现有索引创建别名。例如,要创建按天划分的别名,可以使用以下步骤。假设要为 2024 年 12 月 3 日的数据创建别名existing_index - 2024.12.03,操作如下:
 
 
         POST _aliases
         {
           "actions": [
             {
               "add": {
                 "index": "existing_index",
                 "alias": "existing_index - 2024.12.03",
                 "filter": {
                   "range": {
                     "@timestamp": {
                       "gte": "2024-12-03T00:00:00",
                       "lt": "2024-12-04T00:00:00"
                     }
                   }
                 }
               }
             }
           ]
         }
  • 在这个别名操作中,actions部分定义了要执行的操作(添加别名),add操作中的index指定了原始索引,alias指定了新创建的别名,filter部分使用range查询来筛选出@timestamp字段在 2024 年 12 月 3 日范围内的数据,以此来模拟按天划分的效果。不过这种方法对于已经存在的数据只是通过别名来划分时间,新数据还需要通过其他方式(如 Logstash 配置)来正确地添加到对应的别名所代表的时间范围内。
0条评论
0 / 1000
朱****德
6文章数
0粉丝数
朱****德
6 文章 | 0 粉丝
原创

重新索引增加ES中已存在索引的时间划分

2024-12-12 09:10:55
8
0
  1. 重新索引(Reindex)结合索引模板
    • 原理
      • 重新索引是将现有索引中的数据复制到一个新的索引结构中的过程。首先需要创建一个带有时间划分功能的索引模板,然后通过重新索引操作将旧索引中的数据按照新的时间划分规则迁移到新索引中。
    • 步骤
      • 创建索引模板
        • 假设要按照天来划分时间,并且有一个名为existing_index的现有索引,数据中有@timestamp字段记录时间信息。首先创建一个索引模板,示例如下:
         PUT _template/template_with_time
         {
           "index_patterns": ["new_index_prefix - *"],
           "settings": {
             "number_of_shards": 1,
             "number_of_replicas": 0
           },
           "mappings": {
             "properties": {
               "@timestamp": {
                 "type": "date"
               }
             }
           },
           "date_matching_pattern": "yyyy.MM.dd",
           "date_histogram_interval": "1d"
         }
  • 这里的index_patterns定义了新索引的名称模式为new_index_prefix - *date_matching_patterndate_histogram_interval分别定义了日期匹配格式和时间间隔(按天划分)。
  • 执行重新索引操作
    • 使用 Elasticsearch 的_reindex API 来将数据从现有索引迁移到新索引。假设现有索引为existing_index,新索引根据日期格式生成(例如,new_index_prefix - 2024.12.03),@timestamp字段为日期字段,操作如下:
 
         POST _reindex
         {
           "source": {
             "index": "existing_index"
           },
           "dest": {
             "index": "new_index_prefix - %{+yyyy.MM.dd}"
           },
           "script": {
             "inline": "ctx._index = 'new_index_prefix - ' + ctx._source['@timestamp'].format('yyyy.MM.dd')",
             "lang": "painless"
           }
         }
  • 在这个_reindex操作中,source部分指定了数据来源的索引(existing_index),dest部分指定了目标索引的格式(new_index_prefix - %{+yyyy.MM.dd}),script部分的脚本用于根据@timestamp字段的值来确定每个文档应该被迁移到哪个具体日期的新索引中。
  1. 修改现有索引的映射和别名(Alias)设置(部分情况适用)
    • 原理
      • 如果现有的索引结构允许,并且时间划分的方式比较简单(例如,只是添加一个基于时间的别名来模拟时间划分),可以通过修改索引的映射和别名来实现时间划分的效果。
    • 步骤
      • 添加日期字段映射(如果不存在)
        • 首先检查现有索引的映射,看看是否已经有合适的日期字段。如果没有,需要添加日期字段映射。假设使用KibanaDev Tools来操作,对于现有索引existing_index,如果要添加@timestamp字段的映射,操作如下:
 
         PUT existing_index/_mapping
         {
           "properties": {
             "@timestamp": {
               "type": "date"
             }
           }
         }
  • 创建时间划分的别名
    • 根据日期条件为现有索引创建别名。例如,要创建按天划分的别名,可以使用以下步骤。假设要为 2024 年 12 月 3 日的数据创建别名existing_index - 2024.12.03,操作如下:
 
 
         POST _aliases
         {
           "actions": [
             {
               "add": {
                 "index": "existing_index",
                 "alias": "existing_index - 2024.12.03",
                 "filter": {
                   "range": {
                     "@timestamp": {
                       "gte": "2024-12-03T00:00:00",
                       "lt": "2024-12-04T00:00:00"
                     }
                   }
                 }
               }
             }
           ]
         }
  • 在这个别名操作中,actions部分定义了要执行的操作(添加别名),add操作中的index指定了原始索引,alias指定了新创建的别名,filter部分使用range查询来筛选出@timestamp字段在 2024 年 12 月 3 日范围内的数据,以此来模拟按天划分的效果。不过这种方法对于已经存在的数据只是通过别名来划分时间,新数据还需要通过其他方式(如 Logstash 配置)来正确地添加到对应的别名所代表的时间范围内。
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0