1

春の MVC プロジェクト内で全文検索機能に取り組んでいます。検索機能は、複数のエンティティ (ユーザーが選択できる) を検索できる必要があります。モデルの @Indexed クラスのインデックスを作成できるようにする次の関数への RequestMapping を作成しました。

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!");
}

注釈を付けてインデックスを作成したい 2 つのクラス (Profielwerkstuk と Begrip) があるとします。@Indexed アノテーションを Begrip クラスではなく Profielwerkstuk クラスに追加し、インデックス ビルダー 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;
}

プロファイルワークストゥク:

@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 とは関係ありません。Profielwerkstuk と Begrip の両方に @IndexedEmbedded の ContainerElement フィールドがあるため、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 に答える