Elasticsearch Spring Data-联接子对象

时间:2018-09-06 14:15:44

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

在当前项目中,我正在使用带有ES 5.5.0的Elasticsearch Spring Data(3.0.9),并且正在研究父子关系的用法(更具体而言,我正在测试哪种方法更好[性能]-嵌套对象或父子关系]。这就是我所拥有的

父实体:

@Document(indexName = "testIndex", type="parentItem", createIndex = false)
public class ParentItem {
    @Id
    private String id;

    @Field(type = FieldType.Text)
    @JsonProperty("value")
    private String value;

    // getters and setters
}

子实体:

@Document(indexName = "testIndex", type="childItem", createIndex = false)
public class ChildItem {
    @Id
    private String id;

    @Field(type = FieldType.Keyword, store = true)
    @Parent(type = "parentItem")
    private String parentId;

    @Field(type = FieldType.Text)
    @JsonProperty("value")
    private String value;

    // getters and setters
}

然后我有一个简单的存储库类(没有主体只是扩展ElasticsearchRepository),而我只是在创建像这样的父子对

ParentItem parent = createParent(); // creating parent instance
ChildItem child = createChild(); // creating child instance
child.setParentId(parent.getId());

,使用存储库保存/编制索引后,该文件将被存储到ES节点-briliant:)

现在的问题是:Spring Data中是否有可能将子对象保留在父实体中,并在获取父对象期间像

那样急于加载此子对象
@Document(indexName = "testIndex", type="parentItem", createIndex = false)
public class ParentItem {
    @Id
    private String id;

    @Field(type = FieldType.Text)
    @JsonProperty("value")
    private String value;

    // can I do anything like this?
    // @WhatAnnotation?
    private ChildItem child;

    // getters and setters
}

或者以其他方式-渴望将父实例“加入”孩子?

@Document(indexName = "testIndex", type="childItem", createIndex = false)
public class ChildItem {
    @Id
    private String id;

    @Field(type = FieldType.Keyword, store = true)
    @Parent(type = "parentItem")
    private String parentId;

    @Field(type = FieldType.Text)
    @JsonProperty("value")
    private String value;

    // can I do anything like this?
    // @WhatAnnotation?
    private ParentItem parent;

    // getters and setters
}

Spring Data中是否有类似的东西?还是我需要实现自己的机制?

另一个问题是,在保存这些文档期间,我只需要使用存储库对ES进行两次“调用”即可。所以回到 creating 示例-我还需要做

ParentItem parent = createParent(); // creating parent instance
ChildItem child = createChild(); // creating child instance
child.setParentId(parent.getId());

parentRepository.index(parent);
childRepository.index(child);

这意味着它不能在一次交易中完成。这对性能似乎不是很好吗?

ES Spring Data是否支持类似的功能?老实说,官方文档并没有帮助-可用的示例也没有显示我刚刚实现的更多内容:(

0 个答案:

没有答案