gpt4 book ai didi

elasticsearch - spring-data-elastic-search 中的父/子关系

转载 作者:行者123 更新时间:2023-11-29 02:54:02 27 4
gpt4 key购买 nike

我正在使用 Spring-Data-Elastic-Search 进行搜索/缓存。我需要执行一个使用 child(TermCache) 和 parent(ConceptCache) 属性的查询并返回子对象的实例(这意味着我不能使用嵌套对象)。

我有以下结构:

@Document(indexName = "termweb" , type = "term")
public class TermCache {

@Id
private String id;
private String name;
private LanguageDTO language;
private String status;
private String definition;

@Field(type = FieldType.String, store = true)
@Parent(type = "concept")
private Long conceptId;

private String displayId;
private Map<Long, String> fields = new HashMap<>();
//todo think about storing it as a collection of nested objects

}


@Document( indexName = "termweb" , type = "concept")
public class ConceptCache implements ConceptDTO{

@Id
private String id;

private String displayId;
private Long dictionaryId;
private String dictionaryName;

private Map<Long, String> fields = new HashMap<>();
}

我需要有关如何处理此类任务的提示;我应该使用两个单独的查询还是应该以某种方式获取父级或其他东西的属性?

最佳答案

同意,我们缺少文档,我们将在即将发布的版本中改进这些文档。

如果您对 spring 数据有任何疑问,elasticsearch stackoverflow 可能不是获得答案的最佳方式(因为我们不会收到新线程的通知),我们有单独的问题/查询谷歌组 https://groups.google.com/forum/#!forum/spring-data-elasticsearch-devs

在不知道你究竟想用上述实体实现什么的情况下,我可以给你一个示例父子实体的例子,如下所示

@Document(indexName = "parent-child", type = "parent-entity")
public class ParentEntity {

@Id
private String id;

@Field(type = FieldType.String, index = FieldIndex.analyzed, store = true)
private String name;
// setter/getter

public ParentEntity() {
}

public ParentEntity(String id, String name) {
this.id = id;
this.name = name;
}
}


@Document(indexName = "parent-child", type = "child-entity")
public class ChildEntity {

@Id
private String id;

@Field(type = FieldType.String, store = true)
@Parent(type = "parent-entity")
private String parentId;

@Field(type = FieldType.String, index = FieldIndex.analyzed, store = true)
private String name;

public ChildEntity() {
}

public ChildEntity(String id, String parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
}

//索引父级(您可以使用许多其他方式来索引,包括使用存储库)

   ParentEntity parent1 = new ParentEntity("parent1", "First Parent");
IndexQuery parentIndex1 = new IndexQuery();
parentIndex1.setId(parent1.getId());
parentIndex1.setObject(parent1);
elasticsearchTemplate.index(parentIndex1);

ParentEntity parent2 = new ParentEntity("parent2", "Second Parent");
IndexQuery parentIndex2 = new IndexQuery();
parentIndex2.setId(parent2.getId());
parentIndex2.setObject(parent2);
elasticsearchTemplate.index(parentIndex2);

//索引 child

   ChildEntity child1 = new ChildEntity("child1", parent1.getId(), "First");
IndexQuery childIndex1 = new IndexQuery();
childIndex1.setId(child1.getId());
childIndex1.setObject(child1);
childIndex1.setParentId(child1.getParentId());
elasticsearchTemplate.index(childIndex1);

ChildEntity child2 = new ChildEntity("child2", parent1.getId(), "Second");
IndexQuery childIndex2 = new IndexQuery();
childIndex2.setId(child2.getId());
childIndex2.setObject(child2);
childIndex2.setParentId(child2.getParentId());
elasticsearchTemplate.index(childIndex2);

//搜索

搜索父/子实体时有几个可用选项,包括 has children , has parenttop children查询。

   QueryBuilder query = topChildrenQuery("child-entity", QueryBuilders.termQuery("name", child1name.toLowerCase()));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).build();

List<ParentEntity> parents = elasticsearchTemplate.queryForList(searchQuery, ParentEntity.class);

希望这个小例子能让您基本了解如何使用 parent child。看看ParentChildTests了解更多。

如果您还有其他问题,请随时与我们联系。

关于elasticsearch - spring-data-elastic-search 中的父/子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23730641/

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