Я пытаюсь сохранить объекты, содержащие (только) строку json, в ElasticSearch, но хочу, чтобы поля в документе json хранились индивидуально в Elastic, а НЕ как одна строка.
Я использую ElasticsearchRepository.
public interface MyRepository extends ElasticsearchRepository<MyEntity, Long>
И настроил мою сущность следующим образом:
@NoArgsConstructor
@Getter
@Setter
@Document(indexName = "my-index")
public class MyEntity
{
@Id
private Long key;
private String json;
}
Если бы объект json был простым, я мог бы воссоздать все поля в сущности и сопоставить их с этими полями. Пример:
json = "{"key":"123", "name":"Bob", "age":30, ...}"
И в MyEntity:
public class MyEntity
{
@Id
private Long key;
private String name;
private String age;
// And so on ...
}
Я знаю, что это сработает, но настоящие строки json содержат сотни (вложенных) полей, поэтому я не хочу заново создавать их все в классе сущности.
Могу ли я добиться того же результата, не записывая все поля и продолжая использовать repository.save()
?
Этот связанный вопрос относится к 2015 году. Решение передает файл json в setSource(jsonDoc)», но не похоже, что сохраняемые объекты содержат какой-либо json.
Большое спасибо за вашу помощь!
Вы можете использовать аннотацию @Field(type = FieldType.Object) для хранения документов JSON в Elasticsearch с полями, индексируемыми индивидуально, без необходимости заново создавать все поля в вашем классе сущности. Попробуйте этот подход;
@NoArgsConstructor
@Getter
@Setter
@Document(indexName = "my-index")
public class MyEntity {
@Id
private Long key;
@Field(type = FieldType.Object)
private Map<String, Object> json;
}
если бы вы создали объект сущности, были ли бы какие-либо поля, допускающие значение NULL? Вы можете использовать инструмент для создания объекта сущности. Я бы использовал чатгпт. но есть и другие инструменты JSON для POJO. Вы хотели бы, чтобы в json присутствовало столько полей, сколько должно существовать в объекте. Тогда некоторые типы, скорее всего, являются строками и должны быть длинными.