如何覆盖 Spring ElasticSearch 中的字符串列表字段?

How can I overwrite a list field of strings in Spring ElasticSearch?

我正在使用 ElasticSearch 的 Spring 数据库。我有一个如下所示的 ES 文档:

@Getter
@Setter
@Document(indexName = "my_ideas")
public class MyIdea {
    @Id
    @Field(type = FieldType.Long)
    private Long id;

    @Field(type = FieldType.Text)
    private List<String> countries;

    // ... more fields
}

我有一个 API 端点,它接受新的国家列表。我的目标是简单地覆盖上面 ES 文档中的国家列表。为此,我使用:

@Autowired
ElasticsearchOperations esRestTemplate;

SearchHits<MyIdea> hits = esRestTemplate.search(searchQuery, MyIdea.class);
MyIdea ideaDoc = hits.getSearchHits().stream().findFirst().orElse(null).getContent();
// call method to update the countries
esRestTemplate.save(ideaDoc);

也就是说,我只是用其他东西覆盖了文档上的国家/地区列表。我假设 ES 的 #save() 方法的行为类似于 JPA 的方法。预期的行为是,从逻辑上讲,先前的国家/地区列表将被删除,而我传入的国家/地区列表将被替换。令我惊讶的是,我观察到上述文件列表中的国家/地区 添加了 ,同时保留了已经存在的值。因此,假设文档以列表中的“美国”和“加拿大”开头,而我传入了“新加坡”,那么在调用 #save().[=15= 之后,该列表实际上将包含所有三个国家/地区。 ]

Spring 的 ElasticSearch 专家能否指出我哪里出错了?

经过仔细调查,发现用于填充 ElasticSearch 文档的源对象中有一些重复数据。至少,重复数据被复制到 ES 文档中。一旦我解决了这个问题,问题就消失了。所以 Spring ElasticSearch 的 #save() 按预期工作,它知道如何插入或更新 ES 文档。