4

検索/キャッシュの目的で 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<>();
}

この種のタスクを処理する方法についてのヒントが必要です。2 つの別々のクエリを使用する必要がありますか、それとも親のプロパティまたは他の何かを取得する必要がありますか?

4

2 に答える 2

10

同意しました。今後のリリースで改善する予定のドキュメントが不足しています。

春のデータelasticsearch stackoverflowについて質問がある場合は、おそらく回答を得るための最良の方法ではありません(新しいスレッドについて通知されないため)、質問/クエリ用の別のGoogleグループがあります 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 parent、およびtop 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 クエリを使用するだけです

これにより、親フィールドでリクエストが行われ、一致する親ドキュメントの子ドキュメントが生成されます。その後、返された子ドキュメントでフィルターを使用できます:)

于 2014-05-20T06:37:13.190 に答える