【发布时间】:2021-10-18 09:44:02
【问题描述】:
我正在为 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() 之后,列表实际上将包含所有三个国家。
ElasticSearch for Spring 的专家可以指出我在哪里出错了吗?
【问题讨论】:
标签: java elasticsearch spring-data document