构建多个指标与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;
}
我想你可能会打HSEARCH-598,可以通过大幅降低由MassIndexer使用的线程数找出或在连接池中放置非常大的连接限制。另外不要忘记配置您的数据库以允许多个连接。
如果是这样的话,请在这个问题上发表评论,我们将它提升优先级..对不起,我没有解决它尚未作为迄今为止提出的任何解决方案,对整个索引时坏的影响。
这确实似乎是这个问题是相当低的。我使用MassFordexer文档中描述的threadsForSubsequentFetching()和threadsToLoadObjects(),现在构建索引确实完成了!我也将它添加为bug报告的评论。 – 2013-03-10 20:47:27
昨天好像问题解决了,但现在看来仍然存在。查看问题中的编辑。 – 2013-03-11 13:25:07
你究竟做了什么?你减少了线程?确保你确认你有足够的连接。 – Sanne 2013-03-11 22:48:55
这听起来对我来说,你的两个类有一个双向关联,你碰上指数化的循环:索引时则索引B的指数的等等......你可以发布你的类的相关部分? – benzonico 2013-03-09 15:54:12
没有没有周期是有一定限度的,因为他用明确的_includePaths_ – Sanne 2013-03-09 19:29:17