【问题标题】:Dynamic index naming with class name带类名的动态索引命名
【发布时间】:2019-04-22 12:07:52
【问题描述】:

我正在为 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();
}

所有扩展 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";
}
}

Duck 类扩展了 TwoLeggedAnimals,后者又扩展了“Animals”类,因此,Duck 有资格创建索引。 Horse类同解

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

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

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

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

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

    但您不能在 Elasticsearch 6.0 后的同一索引中存储不同类型(如 TwoLeggedAnimalsFourLeggedAnimals)(请参阅 ES 6.0 breaking changes)。只要您使用一种类型,您的程序就可以运行,只要您尝试存储第二种类型,您就会得到

    Elasticsearch 异常 [type=illegal_argument_exception, reason=Rejecting mapping update to [animals] 因为最终的映射将有超过 1 种类型:[twoleggedanimal,fourleggedanimal]]

    上一个 5.x 版本 5.6 支持到 2019-03-11 (Elastic end of life dates),因此不再支持。

    因此,由于无法在索引中存储一种以上的类型,因此您将不得不重新考虑您的类以及如何存储它们 - 请同时查看ES removal of types,如果那里列出的替代方案可能对您有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2017-05-25
    • 2019-04-06
    • 2012-08-10
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多