我正在研究 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 的相关注释部分。
开始:
@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 字段。
容器元素:
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;
}