我正在创建一个spring-data-elasticsearch框架作为一个实践项目。 我的问题是关于@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();
}
所有扩展动物的具体类都将在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";
}
}
Duck类扩展TwoLeggedAnimals,后者又扩展了“ Animals”类,因此Duck符合创建索引的条件。 对马类的解释相同
class Horse extends FourLeggedAnimals {
Horse() {
this.name = Horse.class.getSimpleName();
}
@Override
public String makeSomeNoise() {
return "neigh";
}
}
答案 0 :(得分:0)
您没有写出具体的问题或错误以及所使用的ES版本。
您可以将带有索引名称的@Document
注释放在抽象基类上,然后使用派生类将实体存储到索引中,而无需在派生类上添加任何注释;这没有问题。
但是自Elasticsearch 6.0起,您不能将不同类型(如TwoLeggedAnimals
和FourLeggedAnimals
)存储在同一索引中(请参阅ES 6.0 breaking changes)。只要您使用一种类型,您的程序就可以运行,一旦尝试存储第二种类型,您将获得
Elasticsearch异常[type = illegal_argument_exception,reason =拒绝将映射更新更新为[animals],因为最终映射将具有1种以上的类型:[twoleggedanimal,fourleggedanimal]]
最新的5.x版本5.6在2019-03-11(Elastic end of life dates)之前一直受支持,因此不再受支持。
因此,由于不可能在索引中存储多个类型,因此您将不得不重新考虑您的类以及如何存储它们-请检查ES removal of types,如果此处列出的替代方法可能会有所帮助你。