【发布时间】:2016-11-22 12:49:44
【问题描述】:
我有一个文档,其中包含在 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);
}
}
但是 save 方法会覆盖整个文档:
{
"id" : 1,
"username" : "...",
"address" : "..."
}
ElasticsearchRepository 似乎不支持部分 udpdate。于是我用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);
}
}
但是有两个相似的引用(repository 和 ElasticsearchTemplate)似乎有点多余。
谁能给我一个更好的解决方案?
【问题讨论】:
标签: java spring-data-elasticsearch