【问题标题】:Spring Data Elasticsearch InheritanceSpring Data Elasticsearch 继承
【发布时间】:2022-02-02 23:25:59
【问题描述】:

有没有办法制作一个超类文档(例如index name = user)并创建两个子类(AdminGuest)以将所有这些保存到user索引但具有不同的字段?例如。添加到超类字段type 并基于该字段获取正确的实体? ELK 7.19,Spring Data 4.3.1。

【问题讨论】:

标签: spring spring-data spring-data-elasticsearch


【解决方案1】:

你可以这样做。使基类抽象。我在测试设置中有以下类:

@Document(indexName = "type-hints")
public abstract class BaseClass {

    @Id
    private String id;

    @Field(type = FieldType.Text)
    private String baseText;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getBaseText() {
        return baseText;
    }

    public void setBaseText(String baseText) {
        this.baseText = baseText;
    }

    @Override
    public String toString() {
        return "BaseClass{" +
            "id='" + id + '\'' +
            ", baseText='" + baseText + '\'' +
            '}';
    }
}
public class DerivedOne extends BaseClass {
    @Field(type = FieldType.Text)
    private String derivedOne;

    public String getDerivedOne() {
        return derivedOne;
    }

    public void setDerivedOne(String derivedOne) {
        this.derivedOne = derivedOne;
    }

    @Override
    public String toString() {
        return "DerivedOne{" +
            "derivedOne='" + derivedOne + '\'' +
            "} " + super.toString();
    }
}
public class DerivedTwo extends BaseClass {
    @Field(type = FieldType.Text)
    private String derivedTwo;

    public String getDerivedTwo() {
        return derivedTwo;
    }

    public void setDerivedTwo(String derivedTwo) {
        this.derivedTwo = derivedTwo;
    }

    @Override
    public String toString() {
        return "DerivedTwo{" +
                "derivedTwo='" + derivedTwo + '\'' +
                "} " + super.toString();
    }
}
interface TypeHintRepository extends ElasticsearchRepository<BaseClass, String> {
    SearchHits<? extends BaseClass> searchAllBy();
}
@RestController
@RequestMapping("/typehints")
public class TypeHintController {

    private static final Logger LOGGER = LoggerFactory.getLogger(TypeHintController.class);

    private final TypeHintRepository repository;

    public TypeHintController(TypeHintRepository repository) {
        this.repository = repository;
    }

    @GetMapping
    public void test() {

        List<BaseClass> docs = new ArrayList<>();

        DerivedOne docOne = new DerivedOne();
        docOne.setId("one");
        docOne.setBaseText("baseOne");
        docOne.setDerivedOne("derivedOne");
        docs.add(docOne);

        DerivedTwo docTwo = new DerivedTwo();
        docTwo.setId("two");
        docTwo.setBaseText("baseTwo");
        docTwo.setDerivedTwo("derivedTwo");
        docs.add(docTwo);

        repository.saveAll(docs);

        SearchHits<? extends BaseClass> searchHits = repository.searchAllBy();

        for (SearchHit<? extends BaseClass> searchHit : searchHits) {
            LOGGER.info(searchHit.toString());
        }
    }
}

【讨论】:

  • 太棒了!你拯救了我的一天!
猜你喜欢
  • 2016-11-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2019-12-08
  • 2012-02-06
相关资源
最近更新 更多