gpt4 book ai didi

java - 使用类名动态命名索引

转载 作者:行者123 更新时间:2023-12-02 06:25:07 24 4
gpt4 key购买 nike

我正在为 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,而 TwoLeggedAnimals 又扩展了“Animals”类,因此 Duck 符合创建索引的资格。Horse 类的解释相同

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

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

最佳答案

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

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

但是自 Elasticsearch 6.0 以来,您无法在同一索引中存储不同类型(例如 TwoLeggedAnimalsFourLeggedAnimals)(请参阅 ES 6.0 breaking changes )。只要您使用一种类型,您的程序就会工作,一旦您尝试存储第二种类型,您就会得到

Elasticsearch exception [type=illegal_argument_exception, reason=Rejecting mapping update to [animals] as the final mapping would have more than 1 type: [twoleggedanimal, fourleggedanimal]]

最后一个 5.x 版本 5.6 的支持直到 2019 年 3 月 11 日 ( Elastic end of life dates ),因此不再受支持。

因此,由于不可能在索引中存储多种类型,因此您必须重新考虑您的类以及如何存储它们 - 请检查 ES removal of types另外,如果那里概述的替代方案可能对您有帮助。

关于java - 使用类名动态命名索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55794169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com