Динамическое именование индекса с именем класса - PullRequest
0 голосов
/ 22 апреля 2019

Я создаю основу для spring-data -asticsearch в качестве учебного проекта.Мой вопрос касается тега @Document, который будет создавать индекс на основе имени, указанного в параметре indexName аннотации.

Однако я думаю, возможно ли сделать его динамичным!В большинстве моих примеров использования имя индекса будет соответствовать имени класса.Все мои классы индексов будут расширять абстрактный класс, который имеет общую реализацию для всех, и конкретные реализации должны быть выполнены в классе сущности.

Это означает, что я должен поддерживать аннотацию @Document для каждой сущности.Но поскольку все сущности будут расширять конкретный абстрактный класс, можно ли аннотировать абстрактный класс и каким-то образом указывать Spring использовать имя класса в качестве имени индекса.

import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "BaseClassName OR something like Animal.getName" /*And other index properties of-course*/)
abstract class Animal {
String name;

public String getName() {
    return name;
}

public abstract String makeSomeNoise();
}

Весь конкретный класс, который расширяет Animalsбудет проиндексирован в Elasticserch.

abstract class TwoLeggedAnimals extends Animal {}

abstract class FourLeggedAnimals extends Animal {}

Вышеупомянутые два являются просто классами группировки.Ради примера

class Duck extends TwoLeggedAnimals {
public Duck() {
    this.name = Duck.class.getSimpleName();
}
@Override
public String makeSomeNoise() {
    return "quack";
}
}

Class Duck расширяет TwoLeggedAnimals, что, в свою очередь, расширяет класс "Animals" и, таким образом, Duck отвечает требованиям для создания индекса.То же самое объяснение для класса лошади

class Horse extends FourLeggedAnimals {
Horse() {
    this.name = Horse.class.getSimpleName();
}

@Override
public String makeSomeNoise() {
    return "neigh";
}
}

1 Ответ

0 голосов
/ 23 апреля 2019

Вы не написали, в чем заключается ваша конкретная проблема или ошибка и какую версию ES вы используете.

Вы можете поместить аннотацию @Document с именем индекса в абстрактный базовый класс, а затем использовать производный класс.хранить ваши объекты в индексе, не добавляя аннотации к вашему производному классу;это работает без проблем.

Но вы не можете хранить различные типы (например, TwoLeggedAnimals и FourLeggedAnimals) в одном и том же индексе, начиная с Elasticsearch 6.0 (см. ES 6.0, критические изменения)).Ваша программа будет работать до тех пор, пока вы используете один тип, и как только вы попытаетесь сохранить второй тип, вы получите

Исключение Elasticsearch [type = нелегальное_argument_exception, причина = Отклонение обновления отображения для [животные], так как окончательное отображение будет иметь более 1 типа: [twoleggedanimal, fourleggedanimal]]

Последняя версия 5.x 5.x имела поддержку до 2019-03-11 ( Elastic end ofдаты жизни ), так что это больше не поддерживается.

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

...