具有类名的动态索引命名

时间:2019-04-22 12:07:53

标签: java elasticsearch spring-data-elasticsearch

我正在创建一个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";
}
}

1 个答案:

答案 0 :(得分:0)

您没有写出具体的问题或错误以及所使用的ES版本。

您可以将带有索引名称的@Document注释放在抽象基类上,然后使用派生类将实体存储到索引中,而无需在派生类上添加任何注释;这没有问题。

但是自Elasticsearch 6.0起,您不能将不同类型(如TwoLeggedAnimalsFourLeggedAnimals)存储在同一索引中(请参阅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,如果此处列出的替代方法可能会有所帮助你。