Spring ElasticSearch сохранить поле как JSON - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть приложение 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]}
                      ...

Как этого добиться?

...