春の 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;
}