使用hibernate搜索构建多个索引

时间:2013-03-09 15:50:35

标签: hibernate jpa spring-mvc hibernate-search

我正在开发一个spring MVC项目中的全文搜索功能。搜索功能必须能够搜索多个实体(可以由用户选择)。我创建了一个RequestMapping到以下函数,它允许我为我的模型中的@Indexed类构建索引。

public void bouwIndex(HttpServletResponse response) throws InterruptedException {
    OutputWriter output = new HttpResponseOutputWriter(response);
    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
    fullTextEntityManager.createIndexer().startAndWait();
    output.writeLn("Lucene index built!");
}

假设我有两个课程(Profielwerkstuk和Begrip),我已经注释并想要编入索引。当将@Indexed注释添加到Profielwerkstuk类而不是Begrip类并调用索引构建器URL时,Profielwerkstuk会在合理的时间内(20秒左右)正确编入索引,并且在此索引上搜索Profielwerkstukken非常合适。类似地,当@Indexed注释添加到Begrip类但不添加到Profielwerkstuk类时,Begrip的索引也会在合理的时间内(10秒左右)正确创建。

当我将@Indexed类添加到Profielwerkstuk类和Begrip类并尝试构建索引时出现问题,现在创建的索引运行超过10小时而未完成(我在10小时后终止它)。我希望索引器完成的任务与首先构建Profielwerkstuk索引然后构建Begrip索引相同,这两个索引都在合理的时间内完成测试。有没有人知道可能导致我的索引器花费这么长时间的原因?

修改 根据要求,Profielwerkstuk和Begrip的相关注释部分将被添加。

Begrip:

@Indexed
@Analyzer(impl = DutchAnalyzer.class)
public class Begrip {

    @Field
    private String naam;

    @Lob
    @Field
    private String omschrijving;

    @OneToMany(mappedBy = "begrip")
    @IndexedEmbedded(includePaths = { "onderwerp.naam" })
    private List<OnderwerpBegripRelatie> onderwerpen;

    @OneToOne(optional=true, cascade=CascadeType.ALL)
    @IndexedEmbedded(includePaths = { "content", "elementen.content" })
    private ContainerElement inhoud;
}

Profielwerkstuk:

@Indexed
@Analyzer(impl = DutchAnalyzer.class)
public class Profielwerkstuk {

    @Field
    private String titel;

    @OneToOne(cascade = CascadeType.ALL)
    @IndexedEmbedded(includePaths = { "content", "elementen.content" })
    private ContainerElement inhoud;

    @Lob
    @Field
    private String bronvermelding;

    @OneToMany(mappedBy="profielwerkstuk")
    @IndexedEmbedded(includePaths = { "vraag", "toelichting", "eindtermen.keywords.keyword" })
    private List<Onderzoeksvraag> onderzoeksvragen = new ArrayList<Onderzoeksvraag>();
}

我可以补充说,Begrip中嵌入的OnderwerpBegripRelatie类与Profielwerkstuk无关,而Profielwerkstuk中的Onderzoeksvraag与Begrip无关。 ContainerElement部分也可能有助于回答这个问题,因为Profielwerkstuk和Begrip都有一个带@IndexedEmbedded的ContainerElement字段。

ContainerElement:

public class ContainerElement extends Element {

    @OneToMany(mappedBy="container", cascade = CascadeType.ALL)
    @IndexedEmbedded(includePaths = { "content" })
    protected List<Element> elementen;
}

及其父类Element:

public class Element {

    @Lob
    @Field
    private String content;
}

1 个答案:

答案 0 :(得分:1)

我认为您可能正在点击HSEARCH-598,您可以通过大幅减少MassIndexer使用的线程数或在连接池中设置非常大的连接限制来找到答案。另外,不要忘记配置数据库以允许多个连接。

如果是这种情况,请对此问题发表评论,我们将优先考虑它。对不起,我还没有解决它,因为到目前为止提出的任何解决方案都会对整体索引时间产生不良影响。

相关问题