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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弹性重新索引日期格式太短相关的知识,希望对你有一定的参考价值。

尝试重新索引索引,因为日期字段的格式已更改。格式改变了

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

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

我尝试将我的索引重新索引到tmp索引,但它会抛出以下错误:

"cause": {
    "type": "mapper_parsing_exception",
    "reason": "failed to parse [start_date]",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Invalid format: "2019-01-30 13:03" is too short"
    }
  },

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

答案

由于格式已更改,您需要做的是将:00附加到日期字段以匹配新格式:

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

如果您正在寻找更灵活的解决方案,我想为@ 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);
    """
  }
}

以上是关于弹性重新索引日期格式太短的主要内容,如果未能解决你的问题,请参考以下文章

错误代码:38 DB::Exception:无法解析日期:值太短:无法从字符串解析日期:执行“FUNCTION toDate()”时

如何从我的 DatePicker 片段中传输格式化的日期字符串?

因为生活';s太短,不能浪费时间重新输入密码。

删除弹性搜索中的旧索引

我应该对弹性搜索中的非日志数据使用基于时间的索引吗?

如何在elasticsearch中找出索引创建日期