1

我正在研究 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;
}
4

1 回答 1

1

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

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

于 2013-03-09T19:34:09.393 回答