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

cx6n0qe3  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(168)

我正在使用OpenSearch Java client对存储在AWS提供的OpenSearch中的现有文档实施bulk update操作。
BulkRequest请求对象看起来像这样:

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

字符串
doc对象是一个POJO对象,它反映索引中的文档。

public class ProgramSelectionInfoBase implements Serializable {

    private static final long serialVersionUID = 6880667215923483985L;

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

}


我得到的回复是400 Bad Request
在调试模式下,解析的批量请求看起来与bulk update文档中所描述的不同。它缺少"doc"父对象,它应该 Package 部分更新的文档:

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

{ "update": { "_index": "movies", "_id": "tt0816711" } }
{ "doc": { "title": "World War Z" } }


如果我用单个文档更新请求替换批量更新请求,我将获得成功的结果。解析后的请求结构与文档中的结构相匹配:

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

{"doc":{"status35":"active"}}

**问题:**我是否错误地构建了BulkRequest对象?这是客户端库的问题吗?
更新我使用的是最新的OpenSearch Java客户端版本

vojdkbi0

vojdkbi01#

在等待响应的过程中,我想出了两个变通方法:
1.当前的需求允许我切换到单个文档更新选项。正如问题中提到的,它成功地工作了。但是,将来很有可能需要更新一组文档,最好使用批量选项。
2.创建类 Package 器。它将有一个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;
    }
}

字符串

相关问题