1

我想在 Hibernate Search 中的某处注入我的代码,其中 Document 对象已完全准备好但尚未编入索引。据我所知,概念 Document 对象是由DocumentBuilderIndexedEntity类创建的。getDocument方法准备主字段(Id 和 _hibernate_class),然后调用buildDocumentFields,其中调用了 classBridge。然后它在基础级别添加所有字段(也调用 FieldBridge)并添加所有嵌入式对象,递归调用buildDocumentFields。到目前为止对我来说相当清楚。

对于所有桥梁,我逐渐填充了 Document 对象。我的目标是在提供给索引引擎之前获得最终的文档版本(从getDocument返回女巫)以进行一些计算。可能吗?最简单的方法是什么?

顺便提一句。我虽然是关于自定义 IndexManager,但对于这个简单的目的来说它似乎太复杂了......

感谢您的宝贵时间,希望您能有所帮助。

解决方案:

我最终决定实现IndexManager实现,扩展DirectoryBasedIndexManager和覆盖文档索引方法(performStreamOperationperformOperations)。

下面是我的代码:

public class SearchIndexManager extends DirectoryBasedIndexManager
{
    private void processDocument(Document doc)
    {
        if (doc != null && doc.getFields() != null) 
        {
            for (Fieldable field : doc.getFields())
                {/*my job goes here*/};
        }
    }

    @Override
    public void performStreamOperation
    (LuceneWork singleOperation,IndexingMonitor monitor, boolean forceAsync) 
    {
        if (singleOperation != null)
            processDocument(singleOperation.getDocument());
        super.performStreamOperation(singleOperation, monitor, forceAsync);
    }

    @Override
    public void performOperations
    (List<LuceneWork> workList,IndexingMonitor monitor)
    {
        for (LuceneWork lw: workList) 
        {
            if (lw != null)
                processDocument(lw.getDocument());
        }
        super.performOperations(workList, monitor);
    }
}
4

1 回答 1

2

对于今天可用的版本 (4.2),这是不可能的:您可以应用 ClassBridge 来编辑文档,但这将替代所有其他字段。

我很想添加这样一个功能,并认为我们基本上会重新设计 ClassBridge 注释,以便在这个后期阶段(在文档构建之后)应用,以便在支持 Lucene 4 的工作期间实现这一点。

请描述您对JIRA功能请求的期望;通常我会邀请你提出一个补丁,但在这种情况下,我们已经考虑了很多变化,所以我认为最好是你可以举例说明你的用例,最好是通过测试。伪代码测试也是受欢迎的,因为它只是一个概念。

为了避免等待将来的版本,您确实可以使用自定义IndexManager:它并不复杂,因为提供的那些旨在扩展,只需覆盖您需要的方法。作为IndexManager的替代方案,您可以考虑通过扩展默认的(org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessor )来实现自定义的org.hibernate.search.backend.spi.BackendQueueProcessor。请记住,我们不会像其他 API 那样为这些类型保留向后兼容性策略。

于 2013-05-21T21:45:16.710 回答