Ich habe ein Dokument mit vielen Feldern (einige geschachtelt) indiziert auf elasticsearch. Zum Beispiel:Teilupdate mit Spring Data Elasticsearch Repository
{
"id" : 1,
"username" : "...",
"name" : "...",
"surname" : "...",
"address" : "...",
"age": 42,
...
"bookmarks" : [{...}, {...}],
"tags" : [{...}, {...}]
}
nur einige eingereicht wird in meiner Einheit zugeordnet (ich will nicht das gesamte Dokument zur Karte):
@Document(indexName = "...", type = "...")
public class User {
@Id
private int id;
private String username;
private String address;
// getter/setter methods
}
In der Serviceklasse würde Ich mag ein Teil-Update tun mit ElasticsearchRepository, ohne alle Felder in der Einheit des Dokuments abbildet:
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);
}
}
aber speichern Methode überschreibt das gesamte Dokument:
{
"id" : 1,
"username" : "...",
"address" : "..."
}
Teil udpdate von ElasticsearchRepository nicht unterstützt zu sein scheint. So habe ich ElasticsearchTemplate, um eine teilweise Aktualisierung zu machen, zum Beispiel:
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);
}
}
aber scheint ein wenig überflüssig haben zwei ähnliche Referenzen (Repository und ElasticsearchTemplate).
Kann mir jemand eine bessere Lösung vorschlagen?
Dank Shahnaz, in meiner endgültigen Lösung habe ich nur ElasticSearchTemplate verwendet, um Benutzerobjekt zu lesen und zu aktualisieren. Aber ich hoffe, dass es möglich sein wird, auch teilweise mit Spring Data Elasticsearch Repositories zu aktualisieren. – pz74
AFAIK im Moment gibt es kein Teilupdate mit Repositories, wenn Sie etwas finden, lassen Sie es mich bitte auch wissen. Vielen Dank –