4

我正在使用 Spring-Data-Elastic-Search 进行搜索/缓存。我需要执行一个使用子(TermCache)和父(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<>();
}

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

4

2 回答 2

10

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

如果您对 spring data 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);

// 索引孩子

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

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

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

于 2014-05-28T11:29:21.857 回答
0

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

这将对父字段提出请求,并产生匹配父文档的子文档。然后,您可以对返回的子文档使用过滤器:)

于 2014-05-20T06:37:13.190 回答