Хранить структуру Key-Value в Elasticsearch через Spring-Data
Мне нужна информация о том, как наилучшим образом хранить документ (Java POJO) с аннотацией Spring-Data-Elasticsearch @Document, которая включает карту
@Document(indexName = "downloadclienterrors", type = "downloadclienterror")
public class DownloadClientErrorLogElasticsearch {
@Id
private Long id;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String host;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String shortMessage;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String fullMessage;
@Field(type = FieldType.Date)
private String clientTimestamp;
private Integer level;
private Map<String, String> additionalFieldList;
...
}
Подобно тому, как POJO создан в этом первом классе, я могу сохранить его через свой репозиторий в экземпляре эластичного поиска.
Это способ, которым я добавляю затем данные в него, я хочу быть гибким, какие поля JSON я добавляю, потому что это гибко из моего клиентского программного обеспечения.
additionalFieldList.put("url", "http://www.google.de");
additionalFieldList.put("user_agent", "Browser/1.0.0 Windows");
Моя проблема в том, что мне нужны также поля в дополнительном списке полей, помеченном как.not_analyzed. (например, AdditionalFieldList.url, AdditionalFieldList.user_agent). Я хотел бы иметь такое же поведение, как с аннотацией FieldIndex.not_analyzed для String также на моей карте, но, конечно, только для значения на карте.
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private Map<String, String> additionalFieldList;
Но это не работает, когда я пытаюсь сохранить документ. Я получаю ужасное исключение.
Когда кто-то знает способ или как было бы лучше разработать такой документ в asticsearch, потому что я ухожу свежим и новым в этой области, я хотел бы услышать некоторые комментарии.
Спасибо, прежде чем и серые приветствия из Гамбурга,
Томми Циглер
2 ответа
Что вам нужно сделать, это создать еще один дополнительный класс и добавить туда AdditionalFieldList.
что-то вроде этого-
public class additional {
private Map<String, String> additionalFieldList;
}
and then use this class in your pojo
@Document(indexName = "downloadclienterrors", type = "downloadclienterror")
public class DownloadClientErrorLogElasticsearch {
@Id
private Long id;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String host;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String shortMessage;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
private String fullMessage;
@Field(type = FieldType.Date)
private String clientTimestamp;
private Integer level;
@Field(type = FieldType.Nested)
private additional additional;
...
}
Вы можете использовать аннотацию @Mapping для настройки динамических_темплат.
Просто поместите файл сопоставления в путь к классам и аннотируйте ваш POJO с помощью @Mapping.
Пример картирования
JSON
{
"downloadclienterrors": {
"dynamic_templates": [
{
"additionalFieldList": {
"path_match": "additionalFieldList.*",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
...
}
}
POJO
@Mapping(mappingPath = "/downloadclienterrors.json")
@Document(indexName = "downloadclienterrors", type = "downloadclienterror")
public class DownloadClientErrorLogElasticsearch {
...
}