构建多个指标与Hibernate Search的

问题描述:

我工作的全文搜索功能的Spring MVC的项目中。搜索功能必须能够搜索多个实体(可以由用户选择)。我为以下函数创建了一个RequestMapping,它允许我为模型中的@Indexed类构建索引。构建多个指标与Hibernate Search的

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,并Onderzoeksvraag在Profielwerkstuk是不相关的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; 
} 

与其父类元素:

public class Element { 

    @Lob 
    @Field 
    private String content; 
} 
+1

这听起来对我来说,你的两个类有一个双向关联,你碰上指数化的循环:索引时则索引B的指数的等等......你可以发布你的类的相关部分? – benzonico 2013-03-09 15:54:12

+0

没有没有周期是有一定限度的,因为他用明确的_includePaths_ – Sanne 2013-03-09 19:29:17

我想你可能会打HSEARCH-598,可以通过大幅降低由MassIndexer使用的线程数找出或在连接池中放置非常大的连接限制。另外不要忘记配置您的数据库以允许多个连接。

如果是这样的话,请在这个问题上发表评论,我们将它提升优先级..对不起,我没有解决它尚未作为迄今为止提出的任何解决方案,对整个索引时坏的影响。

+0

这确实似乎是这个问题是相当低的。我使用MassFordexer文档中描述的threadsForSubsequentFetching()和threadsT​​oLoadObjects(),现在构建索引确实完成了!我也将它添加为bug报告的评论。 – 2013-03-10 20:47:27

+0

昨天好像问题解决了,但现在看来仍然存在。查看问题中的编辑。 – 2013-03-11 13:25:07

+0

你究竟做了什么?你减少了线程?确保你确认你有足够的连接。 – Sanne 2013-03-11 22:48:55