OpenSearch Java 客户端:现有文档的批量更新导致 400 错误请求

I. *_*kov 5 java opensearch elasticsearch amazon-opensearch

我正在使用OpenSearch Java 客户端对 AWS 提供的 OpenSearch 中存储的现有文档实施批量更新操作。

请求BulkRequest对象如下所示:

BulkRequest request = new BulkRequest.Builder().operations(o -> o.update(u -> u.index(indexName).id(String.valueOf(id)).document(doc))).build();
        
openSearchClient.bulk(request);
Run Code Online (Sandbox Code Playgroud)

doc对象是一个 POJO 对象,反映索引内的文档。

public class ProgramSelectionInfoBase implements Serializable {

    private static final long serialVersionUID = 6880667215923483985L;

    private long id;
    private String status35;
    // other fields, getters, setters.

}
Run Code Online (Sandbox Code Playgroud)

我收到的响应是400 Bad Request

在调试模式下,解析的批量请求看起来与批量更新文档中应有的不同。它缺少"doc"父对象,该对象应该包装部分更新的文档:

{ "update" : { "_id" : "361710", "_index" : "program_search" }}
{ "status35": "draft" }. <- doc is missing.


{ "update": { "_index": "movies", "_id": "tt0816711" } }
{ "doc": { "title": "World War Z" } }
Run Code Online (Sandbox Code Playgroud)

如果我用单个文档更新请求替换批量更新请求,我会得到成功的结果。解析后的请求结构与文档一相符:

UpdateRequest<Object, Object> request = new UpdateRequest.Builder<>().id(String.valueOf(id)).doc(doc).index(indexName).build();
openSearchClient.update(request, Object.class);

{"doc":{"status35":"active"}}
Run Code Online (Sandbox Code Playgroud)

问题:我是否BulkRequest错误地构建了一个对象?或者这是客户端库的问题?

更新我正在使用最新的 OpenSearch Java 客户端版本

I. *_*kov 0

在等待回复时我想出了两种解决方法:

1.当前的要求允许我切换到单个文档更新选项。正如问题中提到的,它工作成功。但是,将来我很可能需要更新一组文档,最好使用批量选项。

2.创建一个类包装器。它将有一个doc字段,允许在将对象转换为 JSON 后接收所需的请求结构:

public class UpdateRootDocument<T> {

    T doc;

    public UpdateRootDocument(T doc) {
        this.doc = doc;
    }

    public T getDoc() {
        return doc;
    }

    public void setDoc(T doc) {
        this.doc = doc;
    }
}
Run Code Online (Sandbox Code Playgroud)