Hibernate搜索IndexedEmbedded Out of Memory

时间:2015-06-16 03:22:57

标签: java hibernate lucene hibernate-search

我有两个实体(entityA和entityB),其中一个实体包含另一个@IndexedEmbedded,因为当我搜索时,我想通过entityB进行查询,并返回entityA。

关系(简化)就是这样:

public class EntityA {
    private String name;

    @OneToMany
    @IndexedEmbedded
    private List<EntityB> children;
}

public class EntityB {
    @ManyToOne
    @ContainedIn
    private EntityA parent;

    private String childName;
}

我现在遇到问题,因为在关系上,&#34;孩子&#34;在entityA中可以有多达10万件物品。无论我使用的是FullTextSession.index还是MassIndexer,都会导致OutOfMemory问题。

我实际上可以删除EntityA中的@OneToMany映射,因为当我想访问EntityB时,我通常会进行一些过滤和分页的查询,但是如果我删除了@OneToMany,那么Hibernate Search将不会索引我的EntityB。

有没有让FullTextSession.index根据&#34; children&#34;上的批处理执行索引?

2 个答案:

答案 0 :(得分:0)

我觉得你应该将这种关系删除,例如一对多,多对一,并编写连接查询以获取所需大小的结果,获取100k行会杀死内存。

日Thnx, 苏巴

答案 1 :(得分:0)

根据您希望有效执行的查询,您可以反转索引。 您可以将EntityB标记为@Indexed,并将其父级关联标记为@Indexed,而不是将EntityA标记为@IndexedEmbedded

这样,您就不必加载100k元素。

在查询方面,您还需要将查询转换为childName:Emmanuel AND parent.name:Hardy之类的内容 您将收到的是EntityB实例,但您可以通过简单导航或使用ResultTransformer来访问EntityA。

请注意,如果EntityB和EntityA之间的链接很懒,您可以要求Hibernate Search调整其fetching strategy

Criteria criteria = s.createCriteria(EntityB.class).setFetchMode("parent", FetchMode.JOIN); s.createFullTextQuery(luceneQuery).setCriteriaQuery(criteria);