kettle导入es id错误解决

kettle导入es错误解决:an id must be provided if version type or value are set

问题原因:

OpType Create without an ID

​ As of 5.0 indexing a document with op_type=create without specifying an ID is not supported anymore.

即:op_type为create时,必须指定id。

op_type有create(只支持创建文档)和index(支持创建和更新文档)。

  • create:id不能为空,必须指定id,id相同时报错
  • index:id可以为空,不指定id时自动生成,id相同时覆盖

解决思路:

  • 如果自动生成则 id为空,用index
  • 如果id字段为空,则用index,不选用overwrite
  • 如果id字段不为空,选用overwrite时,用index;不选overwrite时,用create

源码更改:

this.opType =
StringUtils.isNotBlank( meta.getIdInField() ) && meta.isOverWriteIfSameId() ? DocWriteRequest.OpType.INDEX : DocWriteRequest.OpType.CREATE;

之前代码中当id字段不为空且覆盖写入时用index,否则用create。但此版本用create时必须指定id,因此更改如下:

    //如果id字段为空,则用index,自动生成id,overwrite无效
    if(!StringUtils.isNotBlank( meta.getIdInField() )){
        this.opType = DocWriteRequest.OpType.INDEX;
    }else {
        //如果id字段不为空,选用overwrite时,用index;不选overwrite时,用create
        if(meta.isOverWriteIfSameId()){
            this.opType = DocWriteRequest.OpType.INDEX;
        }else {
            this.opType = DocWriteRequest.OpType.CREATE;
        }
    }

源码及插件链接: https://pan.baidu.com/s/1Cyj3j0f5x2x_YuVgWKMRLA 密码: 9i7b

小问题:

对同一index,之前导入时未选overwrite,如果再选中overwrite,此时不起左右。即选中后不能更改。

  • 用rest api对同一id先create再index是可以,怀疑此处没有更新操作。
  • 查看ktr文件,发现更改后没有自动保存,此处更改后kettle检测不到,需要手动保存。

猜你喜欢

转载自blog.csdn.net/ukakasu/article/details/82422700