当前位置: 首页 > 知识库问答 >
问题:

spring数据弹性搜索中的父/子关系

罗韬
2023-03-14

我使用Spring数据弹性搜索用于搜索/缓存目的。我需要执行一个使用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<>();
}

我需要一个关于如何处理这类任务的提示;我应该使用两个单独的查询,还是应该以某种方式获取父对象的属性,或者其他什么?

共有2个答案

经伟
2023-03-14

您应该简单地使用filter:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-has-parent-filter.html#query-dsl-has-parent-filter的hasak查询

这将在父字段上发出请求,并生成匹配父文档的子文档。然后可以对返回的子文档使用筛选器:)

羿博延
2023-03-14

同意,我们缺乏留档,我们将与即将发布的改进。

如果您对Spring data elasticsearch stackoverflow有任何疑问可能不是获得答案的最佳方式(因为我们不会收到新线程的通知),我们有单独的google组用于提问/查询https://groups.google.com/forum/#!论坛/sping-data-elasticsearch ch-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);

//索引子项

   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);

//正在搜索

在父/子实体上搜索时有几个可用选项,包括有子实体、有父实体和顶级子实体查询。

   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);

希望这个小例子能让你基本了解如何使用父母子女。更多信息请查看父母子女测试。

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

 类似资料:
  • 升级到Spring boot 2.3和Spring data elasticsearch 4.0.9后的问题。我有这样的文档: 这在spring data 3.0中与Jackson配合得很好,但升级到4.0后,Jackson不再可用,现在我收到了一个来自spring的实例化异常,无法实例化URL对象。 例外情况: 任何关于解决方案的想法都将受到赞赏。

  • 我们在Liferay中有一个名为发布的自定义实体。它在弹性搜索中建立了索引,并包含一个名为“Journal alArticleId”的字段。 根据我们的搜索要求,如果一些用户在期刊文章中搜索任何关键字,我们必须返回包含相应期刊的“journalArticleId”的发布文档。 我找到了使用Java API实现这个的解决方案,但我正在寻找Liferay API来解决这个问题。 弹性搜索亲子数据搜索J

  • 我有一个Spring Boot应用程序,我想在其中单独使用弹性搜索2.2.0(而不是嵌入式服务器),我想使用Spring Data弹性搜索,那么Spring Data支持的弹性搜索版本是什么,我如何配置它以连接到运行在localhost:9200中的弹性搜索实例? 实际上,我尝试在application.properties文件中添加以下选项: 后来,我创建了这个配置类: 我得到了这个StackT

  • 我有一个设计糟糕的文档结构: 我想从上面的文档中检索标题、Fach和代码。 多谢了。

  • 我正在使用spring数据elasticsearch来执行CRUD操作。 我有一个扩展Elasticsearch chRepository的自定义存储库。 最终,ElasticsearchRepository扩展了CrudRepository,这意味着可以更新现有记录。 问题是,你是如何做到这一点的?我还没有找到一个名为“update()”的方法 我认为做以下事情会有用(代码从https://gi

  • 我需要运行以下查询: 但我不能用spring data elasticsearch轻松运行这个。 有什么办法吗 spring data elasticsearch是否很好地支持所有elasticsearch查询DSL