2

エンティティ クラスの 1 つで条件付きインデックス作成を使用して Hibernate Search を使用しています。そのエンティティーの@Indexedアノテーションは、特定の状態のインスタンスが索引付けされないようにするカスタム・インターセプターを指定します。

これは期待どおりに完全に機能しています。MassIndexerただし、a を使用してすべてのインデックスを再作成すると、そのエンティティ クラスのカスタム インターセプターが無視されることに気付きました。インターセプターが呼び出されることさえなく、スキップされる基準に適合する場合でも、そのエンティティのすべてのインスタンスにインデックスが作成されることをデバッグ モードで確認しました。

何か不足していますか?エンティティクラスでカスタムインターセプターを利用する Hibernate Search で再インデックスする方法はありますか?

アップデート

このコードスニペットを使用して、Sanne が提案した「古いスタイル」のアプローチに切り替えてみました。

FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
fullTextSession.beginTransaction();

// Kill the current index
fullTextSession.purgeAll(MyEntity.class);
int batchSize = 10;
ScrollableResults results = fullTextSession.createCriteria(MyEntity.class)
        .setFetchSize(batchSize)
        .scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
while(results.next()) {

    // Re-index entites in batches of 10, freeing up memory after each batch
    index++;
    fullTextSession.index(results.get(0));
    if (index % batchSize == 0) {
        fullTextSession.flushToIndexes();
        fullTextSession.clear();
    }
}
fullTextSession.getTransaction().commit();

ただし、 とまったく同じ動作が見られMassIndexerます。条件付きマッピング インターセプター onMyEntityは呼び出されず、すべてのMyEntityインスタンスはインデックス化されるかどうかにかかわらずインデックス化されます。

4

2 に答える 2

2

いいえ、ありません: HSEARCH-1190

それに取り組んで、貢献とテスターを歓迎します!

修正されるまで、前方スクロールのみを使用して古いスタイルのインデックス作成を使用できます。

于 2012-10-05T09:59:22.400 に答える
0

私は同じ問題に遭遇しました。残念ながら、どこにも良い解決策が見つかりませんでした。私は独自のソリューションを開発しようとしましたが、それを誇りに思っていません。誰かがそれを改善できるかもしれません。

int index = 0;
EntityIndexingInterceptor eii = 
        ((SearchFactoryIntegrator) fullTextSession.getSearchFactory())
        .getIndexBindingForEntity(MyEntity.class)
        .getEntityIndexingInterceptor();
while(results.next()) {
    if (eii.onAdd(results.get(0)) != IndexingOverride.SKIP){  // explit call interceptor
        index++;
        fullTextSession.index( results.get(0) ); 
        if (index % BATCH_SIZE == 0) {
            fullTextSession.flushToIndexes();
            fullTextSession.clear(); 
        }
    }
}
fullTextSession.flushToIndexes();

インターセプターをトリガーするより簡単な方法を探していましたが、成功しませんでした:(

ところで。EntityIndexingInterceptor 宣言を見ると、次のことがわかります。

//FIXME should we add onPurge and onIndex?
于 2013-01-02T10:32:51.890 に答える