我有一个文档,其中包含许多字段(一些嵌套),已在 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" : "..."
}
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);
}
}
但是拥有两个类似的引用(repository和ElasticsearchTemplate)似乎有些冗余。
有人能给我提供更好的解决方案吗?