ElasticSearchnoop更新响应不可反序列化

rbl8hiat  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(177)

由于不满足条件,我的脚本更新生成以下noop响应:
/我的idx/更新/我的文档标识

{
    "_index": "my_idx",
    "_type": "_doc",
    "_id": "my_doc_id",
    "_version": 4,
    "result": "noop",
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    }
}

但是,由于WriteResponseBase中的超级构造函数(特别是primaryTermseqNo周围的构造函数)施加的约束,elasticsearch-java客户端无法将此响应反序列化为UpdateResponse<TDocument>,而noop更新响应中显然缺少这些约束:

protected WriteResponseBase(AbstractBuilder<?> builder) {

        this.id = ApiTypeHelper.requireNonNull(builder.id, this, "id");
        this.index = ApiTypeHelper.requireNonNull(builder.index, this, "index");
        this.primaryTerm = ApiTypeHelper.requireNonNull(builder.primaryTerm, this, "primaryTerm");
        this.result = ApiTypeHelper.requireNonNull(builder.result, this, "result");
        this.seqNo = ApiTypeHelper.requireNonNull(builder.seqNo, this, "seqNo");
        this.shards = ApiTypeHelper.requireNonNull(builder.shards, this, "shards");
        this.type = builder.type;
        this.version = ApiTypeHelper.requireNonNull(builder.version, this, "version");
        this.forcedRefresh = builder.forcedRefresh;

    }

我的Java客户端版本是8.4.2,而服务器示例版本是7.2.0。我已经做了一些hacks来使这两个版本一起工作。我想知道这些缺失的字段在7.2.0中是否确实是可选的。不幸的是,我没有办法检查,因为它们在Github中只有7.15.0中的标记。
是否有任何变通办法,或者捕获结果异常并对其进行处理(希望是因为noop)是使其工作的唯一方法?

yfjy0ee7

yfjy0ee71#

Noop的更新响应和真正更新的文档之间的不一致已在this github issue中报告。该问题已在Elasticsearch版本7.4.0中发布的this PR中解决,并在Release notes of that version中确认。
话虽如此,我认为最干净的解决方案是要么将Elasticsearch(考虑到v. 7.2.0是more than 2 years old)更新到版本〉= 7.4.0,要么在您的请求中添加detect_noop标志。请记住,这会迫使文档的版本号总是被更新,即使文档本身实际上没有更新。
此外,我不认为8版本的REST客户端可以与Elasticsearch 7.x兼容,更不用说7.2版本了。Elasticsearch服务器兼容性策略明确声明了客户端是向前兼容的。但您试图以向后兼容的方式使用它。

相关问题