1

Hibernate Search のどこかに自分のコードを挿入したいと思います。ここで、Document オブジェクトは完全に準備されていますが、まだインデックスが作成されていません。私の知る限り、コンセプト Document オブジェクトはDocumentBuilderIndexedEntityクラスによって作成されます。getDocumentメソッドは、マスター フィールド (Id および _hibernate_class) を準備し、classBridge が呼び出される buildDocumentFields を呼び出します次に、すべてのフィールドをベース レベルに追加し (FieldBridge も呼び出します)、再帰的に buildDocumentFieldsを呼び出すすべての埋め込みオブジェクトを追加します。これまでのところ、私にとってはかなり明確です。

すべてのブリッジについて、Document オブジェクトを徐々に埋めていきました。私の目的は、ドキュメントの最終バージョン (ウィッチはgetDocumentから返されます) を取得して、インデックス作成エンジンに提供する前に何らかの計算を行うことです。出来ますか?それを行う最も簡単な方法は何ですか?

ところで。カスタムIndexManagerについて考えましたが、この単純な目的には複雑すぎるようです...

お時間をいただきありがとうございます。お役に立てば幸いです。

解決:

最終的に、 IndexManager の実装、DirectoryBasedIndexManagerの拡張、およびドキュメントのインデックス作成メソッド (performStreamOperationおよびperformOperations) のオーバーライドを実装することにしました。

以下は私のコードです:

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 を適用してドキュメントを編集することはできますが、これは他のすべてのフィールドの代わりになります。

このような機能を追加したいと考えており、Lucene 4 をサポートするための作業中にこれを可能にするために、基本的に ClassBridge アノテーションを再設計して、この後期段階 (ドキュメントの構築後) に適用すると考えています。

JIRA機能のリクエストで期待されることを説明してください。通常はパッチを提案するようお願いしますが、この場合はすでに多くの変更を念頭に置いているため、理想的にはテストを使用して、ユースケースを例示していただければ幸いです. 疑似コードのテストも大歓迎です。これは概念的なアイデアにすぎません。

将来のリリースを待つのを避けるために、実際にカスタムIndexManagerを使用できます。提供されているものは拡張されるように設計されているため、複雑ではありません。必要なメソッドをオーバーライドするだけです。IndexManagerの代わりに、デフォルトのもの ( org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessor ) を拡張して、カスタムorg.hibernate.search.backend.spi.BackendQueueProcessorを実装することを検討できます。他の API の場合のように、これらの型の下位互換性ポリシーを保持していないことに注意してください。

于 2013-05-21T21:45:16.710 に答える