Хранить структуру 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 {

    ...

}
Другие вопросы по тегам