【问题标题】:How can I overwrite a list field of strings in Spring ElasticSearch?如何覆盖 Spring ElasticSearch 中的字符串列表字段?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多