我有一个包含许多在elasticsearch上索引的字段(嵌套)的文档。例如:使用Spring Data Elasticsearch存储库进行部分更新
{
"id" : 1,
"username" : "...",
"name" : "...",
"surname" : "...",
"address" : "...",
"age": 42,
...
"bookmarks" : [{...}, {...}],
"tags" : [{...}, {...}]
}
只有一些申请在我的实体映射(我不想整个文档映射):
@Document(indexName = "...", type = "...")
public class User {
@Id
private int id;
private String username;
private String address;
// getter/setter methods
}
在服务类我愿做部分更新与ElasticsearchRepository,而无需在实体映射的所有文档的字段:
public class UserServiceClass {
@Autowired
private UserElasticsearchRepository userElasticsearchRepository;
public void updateAddress(int id, String updatedAddress) {
User user = userElasticsearchRepository.findOne(id);
user.setAddress(updatedAddress);
userElasticsearchRepository.save(user);
}
}
但保存方法将覆盖整个文档:
{
"id" : 1,
"username" : "...",
"address" : "..."
}
部分udpdate似乎不ElasticsearchRepository支持。所以我用ElasticsearchTemplate,使部分更新,例如:
public class UserServiceClass {
@Autowired
private UserElasticsearchRepository userElasticsearchRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
public void updateAddress(int id, String updatedAddress) {
User user = userElasticsearchRepository.findOne(id);
if (user.getUsername().equals("system")) {
return;
}
IndexRequest indexRequest = new IndexRequest();
indexRequest.source("address", updatedAddress);
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(user.getId()).withClass(User.class).withIndexRequest(indexRequest).build();
elasticsearchTemplate.update(updateQuery);
}
}
,但似乎有点多余有两个类似的引用(库和ElasticsearchTemplate)。
任何人都可以给我一个更好的解决方案吗?
谢谢Shahnaz,在我的最终解决方案中,我只使用ElasticSearchTemplate来读取和更新用户对象。但我希望可以用Spring Data Elasticsearch存储库进行部分更新。 – pz74
AFAIK现在没有部分更新可用于存储库,如果您发现某些内容,请让我知道。谢谢 –