弹性重新编制索引的日期格式太短

时间:2019-03-12 14:10:14

标签: elasticsearch format reindex

由于日期字段的格式已更改,因此试图重新索引索引。 格式更改为

s_repr=" ".join([str(x).zfill(3) for x in foo()]) #not very PEP8 =S

 ...
 "start_date": {
      "type":   "date",
      "format": "yyyy-MM-dd HH:mm",
       "fields": {
        "keyword": { 
          "type": "keyword"
        }
      }
    }
  ...

我尝试将索引重新索引为tmp索引,但是会引发以下错误:

 ...
 "start_date": {
      "type":   "date",
      "format": "yyyy-MM-dd HH:mm:ss",
       "fields": {
        "keyword": { 
          "type": "keyword"
        }
      }
    }
 ...

所以,现在我有一个大问题。如何更改我的日期字段的格式?还有另一种选择不重新编制索引吗?

2 个答案:

答案 0 :(得分:1)

由于格式已更改,因此您需要在日期字段中添加:00以匹配新格式:

POST _reindex
{
  "source": {
    "index": "oldindex"
  },
  "dest": {
    "index": "newindex"
  },
  "script": {
    "source": "ctx._source.start_date = ctx._source.start_date + ':00';"
  }
}

答案 1 :(得分:0)

如果您正在寻找更灵活的解决方案,我想为@Val的答案做出贡献。请检查以下代码:

POST _reindex
{
  "source": { "index": "old-index" },
  "dest": { "index": "new-index" },
  "script": {
    "source": """
      def old_sf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
      def old_dt = old_sf.parse(ctx._source.start_date);
      ctx._source.start_date = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(old_dt);
    """
  }
}

通过这种方式,可以大大简化日期格式的更改。例如,

POST _reindex
{
  "source": { "index": "old-index" },
  "dest": { "index": "new-index" },
  "script": {
    "source": """
      def old_sf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
      def old_dt = old_sf.parse(ctx._source.start_date);
      ctx._source.start_date = new SimpleDateFormat('HH:mm:ss dd MMM yyyy').format(old_dt);
    """
  }
}