У меня есть приложение Spring Data ElasticSearch, которое сохраняет такой документ
@Data
@Builder
@Document(indexName = "listings_data_pipeline", type = ElasticConfig.ELASTICSEARCH_TYPE)
final class ListingsData {
private final String listingId;
private final String actionType;
private final BackOfficeData backOfficeData;
private final SearchAndMatchData searchAndMatchData;
}
Я хочу иметь возможность обновлять только поле, например, backOfficeData, поэтому у меня есть такая служба
@Slf4j
@RequiredArgsConstructor
class ElasticRepo {
private final ElasticsearchTemplate elasticsearchTemplate;
void updateBackOfficeField(final String listingId, final BackOfficeData data) {
final IndexRequest indexRequest = new IndexRequest();
indexRequest.source("backOfficeData", data);
final UpdateQuery updateQuery = new UpdateQueryBuilder().withId(listingId).withClass(ListingsData.class).withIndexRequest(indexRequest).build();
synchronized (this) {
elasticsearchTemplate.update(updateQuery);
}
}
Но, к сожалению, когда я это делаю, поле backOfficeData хранится не вasticSearch как JSON, а как String из метода toString. Таким образом, я получаю это, когда я запрашиваю эластичный:
...
"_source" : {
"listingId" : "3453325",
"actionType" : "OfferRenew",
"backOfficeData" : "BackOfficeData(listingId=3453325, validity=60, experienceIds=[90002, 90001])",
...
Но мне бы хотелось:
...
"_source" : {
"listingId" : "3453325",
"actionType" : "OfferRenew",
"backOfficeData" : {"listingId": "3453325", "validity": "60", "experienceIds" : [90002, 90001]}
...
Как этого добиться?