由于不满足条件,我的脚本更新生成以下noop
响应:
/我的idx/更新/我的文档标识
{
"_index": "my_idx",
"_type": "_doc",
"_id": "my_doc_id",
"_version": 4,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
}
}
但是,由于WriteResponseBase
中的超级构造函数(特别是primaryTerm
和seqNo
周围的构造函数)施加的约束,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
)是使其工作的唯一方法?
1条答案
按热度按时间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服务器兼容性策略明确声明了客户端是向前兼容的。但您试图以向后兼容的方式使用它。