【问题标题】:How to update nested field using POJO in spring-data-elasticsearch如何在 spring-data-elasticsearch 中使用 POJO 更新嵌套字段
【发布时间】:2021-02-23 14:16:42
【问题描述】:

我正在使用 spring-data-elasticsearch 来使用 elasticsearch 作为我的数据源。我以这种方式为我的实体建模

Foo.java

@Document(indexName = "foo", shards = 1, versionType = VersionType.INTERNAL, createIndex = true)
public class Foo {

    @Field(type = FieldType.Text, name = "name")
    private String name;

    @Field(type = FieldType.Nested, name = "bar")
    private Bar bars;
}

Bar.java

public class Bar {

    @Field(type = FieldType.Text, name = "name")
    private String name;
}

我正在使用 UpdateQuery 仅更新 foo 文档中的“bar”值,如下所示

    Map<String, Object> params = new HashMap<>();
            params.put("bar", bar);
UpdateQuery updateQuery = UpdateQuery.builder(id)
                    .withScript("ctx._source.bar = params.bar")
                    .withParams(params)
                    .build();
            UpdateResponse updateResponse = operations.update(updateQuery, index);

我收到以下错误

ava.lang.IllegalArgumentException: cannot write xcontent for unknown value of type class com.myapp.model.Bar
        at org.elasticsearch.common.xcontent.XContentBuilder.unknownValue(XContentBuilder.java:833) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.map(XContentBuilder.java:895) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.map(XContentBuilder.java:870) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:866) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.script.Script.toXContent(Script.java:660) ~[elasticsearch-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:857) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:850) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]
        at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:842) ~[elasticsearch-x-content-7.9.3.jar:7.9.3]

注意: 我尝试使用脚本更新 foo.name 字段。它工作得很好。问题是在更新查询中使用 Bar 对象。

解决这个问题的任何想法

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

    该错误清楚地表明 Elasticsearch 不知道如何存储和处理类 com.myapp.model.Bar,因为它特定于您的域(与所有域通用的 StringBoolean 等相比)。

    因此,您必须明确告诉 Spring 和 Elasticsearch 如何将 com.myapp.model.Bar 映射到简单类型,反之亦然:创建读写转换器,然后将它们注册到 ElasticsearchCustomConversions。完整示例请参见官方文档中的6.1.3. Custom Conversions 部分。

    【讨论】:

    • 对不起,我没有在我的问题中提到这一点。我还为 Foo 和 Bar 模型注册并编写了读写转换器。但是当我使用脚本执行 updateQuery 时,不会调用这些转换器。这些转换器在使用 repository.save(foo) 方法保存 Foo 对象时被调用。
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2020-11-07
    • 2013-02-20
    相关资源
    最近更新 更多