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);
该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
在调试模式下,解析的批量请求看起来与批量更新文档中应有的不同。它缺少"doc"父对象,该对象应该包装部分更新的文档:
{ "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 客户端版本
在等待回复时我想出了两种解决方法:
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;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 1639 次 | 
| 最近记录: |