Что такое аннотация сопоставления и нужна ли она мне (Spring Data ElasticSearch) - PullRequest
0 голосов
/ 23 января 2020

Я работаю с ElasticSearch , используя Spring Data ElasticSearch 3.1.0.RELEASE , и я довольно новичок в самом ElasticSearch, зная об этом немного.

Здесь (spring-data-elasti c docs) Я вижу, что сопоставления (схемы) для документов генерируются автоматически с использованием метаданных (аннотаций) почти так же, как в Spring Data MongoDB динамически c, но в нашей организации все сущности снабжены аннотацией @ Mapping и ссылаются на документы JSON, которые отражают их структуру, поэтому для каждой сущности документа - JSON файл записан, хотя все сущности имеют соответствующие аннотации.

Небольшой фрагмент примера класса, чтобы дать подсказку, о чем я говорю

@Document(indexName = "sampleIndex", type = "sample", shards = 16, createIndex = false)
@Mapping(mappingPath = "/elasticsearch/mappings/sample.json")
public final class Sample {

    @Id
    private String id;

    @Field(type = FieldType.Long)
    private long sampleId;

    @Field(type = FieldType.Keyword)
    private SampleObject sampleObject;

    @Field(type = FieldType.Nested)
    private Map<String, String> data;

И соответствующий /elasticsearch/mappings/sample.json файл

{
    "samples": {
        "mappings": {
            "sample": {
                "properties": {
                    "sampleId": {
                        "type": "long"
                    },
                    "sampleObject": {
                        "type": "string"
                    },
                    "data": {
                        "type": "nested"
                    },
....

Приблизительно я могу понять всю идею этой аннотации, хотя даже не вижу упоминаний об этом в (spring-data). -elasti c документы) и я не вижу ничего значимого JavaDocs .

Несмотря на это, я до сих пор не могу понять, как работает эта аннотация, каковы варианты использования и почему если это необходимо, с моей точки зрения, я бы просто полностью удалил его, потому что схемы могут генерироваться автоматически на основе других аннотаций Spring. Или я не прав?

Дополнительные вопросы, связанные с вопросом: я тоже не уверен в этом: перекрывает ли этот файл сопоставления JSON структуру, определенную в сущности аннотациями?

1 Ответ

1 голос
/ 23 января 2020

Интерфейс ElasticsearchOperations имеет метод putMapping(class<?>). Этот метод может использоваться для записи отображений индекса в индекс. Реактивные реализации репозитория по умолчанию делают это при создании индекса.

Реализация метода по умолчанию проверяет, есть ли в классе аннотация @Mapping. Если да, то используются определения этого отображения. Если эта аннотация отсутствует, то класс проверяется и проверяется на наличие аннотации @Field в свойствах.

Таким образом, в вашем случае аннотации к свойствам не используются для записи сопоставлений индекса.

Я бы порекомендовал использовать свойства класса, потому что более вероятно, что вы измените какое-либо свойство отображения в классе и забудете его в файле json.

Например, в вашем коде класс sampleObject определяется как keyword, но в отображениях это строка. Кто-то, смотрящий только на код, может пропустить другое определение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...