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

sta*_*kov 3 elasticsearch spring-data spring-data-elasticsearch

我正在使用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<>();
}
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*sen 8

同意,我们缺乏文档,我们将在即将发布的版本中进行改进.

如果您对弹簧数据有任何疑问,弹性搜索stackoverflow可能不是获得答案的最佳方式(因为我们不会收到新线程的通知),我们有单独的谷歌组来提问/查询https://groups.google.com/forum/ #!论坛/弹簧数据elasticsearch,开发者

在不知道您正在尝试使用上述实体实现什么的情况下,我可以举例说明示例父子实体,如下所示

    @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;
     }
      }
Run Code Online (Sandbox Code Playgroud)

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

    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);
Run Code Online (Sandbox Code Playgroud)

//索引孩子

    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);
Run Code Online (Sandbox Code Playgroud)

//搜索

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

   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);
Run Code Online (Sandbox Code Playgroud)

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

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