gpt4 book ai didi

spring-boot - ElasticSearch - Spring Boot - Upsert 抛出 DocumentMissingException

转载 作者:行者123 更新时间:2023-11-29 02:48:11 38 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 ElasticSearch。当我尝试使用 Spring 更新插入时,当 ElasticSearch 中没有文档时,它会抛出 DocumentMissingException。当 ElasticSearch 中存在文档时,相同的代码可以正常工作。

异常堆栈跟踪:

org.springframework.data.elasticsearch.ElasticsearchException: Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [{U65929AR1978SGC001748=[company/vteSxfKoRF-k4g982vissw][[company][2]] DocumentMissingException[[_doc][U65929AR1978SGC001748]: document missing], U45309AR2000PTC006288=[company/vteSxfKoRF-k4g982vissw][[company][3]] DocumentMissingException[[_doc][U45309AR2000PTC006288]: document missing],...

代码:

public <S extends Company> void saveAllCustom(Iterable<S> companies) {

List<UpdateQuery> updateQueries = new ArrayList<UpdateQuery>();

ObjectMapper oMapper = new ObjectMapper();

for (S company : companies) {

Map<String, Object> companyJsonMap = (Map<String, Object>) oMapper.convertValue(company, Map.class);

Map<String, Object> paramsDocument = new HashMap<String, Object>();
paramsDocument.put("doc", companyJsonMap);

Script script = new Script(
ScriptType.INLINE
, "painless"
, "if (ctx._source.dataAsOf < params.doc.dataAsOf) {ctx._source = params.doc}"
, paramsDocument);

UpdateRequest updateRequest = new UpdateRequest()
.index("company")
.type("_doc")
.id(company.cin)
.script(script) // Conditional Update
.upsert(companyJsonMap);

UpdateQuery updateQuery = new UpdateQueryBuilder()
.withIndexName("company")
.withType("_doc")
.withId(company.cin)
.withDoUpsert(true)
.withClass(Company.class)
.withUpdateRequest(updateRequest)
.build();

updateQueries.add(updateQuery);

}

elasticsearchTemplate.bulkUpdate(updateQueries);
}

但是一个类似的 upsert 命令正在使用 CURL 工作:

curl -X POST "localhost:9200/company/_doc/10001/_update" -H 'Content-Type: application/json' -d'
{
"script": {
"lang": "painless",
"source": "ctx._source = params.doc",
"params": {
"doc": {
"name": "XYZ LIMITED - updated",
"cin": "10001"
}
}
},
"upsert" : {
"name": "XYZ LIMITED - newly created",
"cin": "10001"
}
}'

根据我的理解,当 ElasticSearch 中没有文档时,它不应该抛出 DocumentMissingException 因为我添加了 upsert(...) 作为在查询中很好。

Elasticsearch 版本: 版本:6.4.3,构建:default/tar/fe40335/2018-10-30T23:17:19.084789Z,JVM:1.8.0_191

安装的插件:

JVM 版本:java 版本“1.8.0_191”Java(TM) SE 运行时环境(build 1.8.0_191-b12)Java HotSpot(TM) 64 位服务器 VM(构建 25.191-b12,混合模式)

操作系统版本: Darwin 内核版本 18.5.0:2019 年 3 月 11 日星期一 20:40:32 PDT; root:xnu-4903.251.3~3/RELEASE_X86_64 x86_64

Spring Boot 版本: 2.1.7.RELEASE

Spring Data ElasticSearch 版本:3.2.0.RC2

最佳答案

Spring Data Elasticsearch 目前不支持此功能。

我们可以在ElasticsearchTemplate的源码中看到使用脚本时不考虑更新插入。

注意这个问题has been reported , 但仍未解决。

关于spring-boot - ElasticSearch - Spring Boot - Upsert 抛出 DocumentMissingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926391/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com