2013-03-09 101 views
1

我工作的全文搜索功能的Spring MVC的項目中。搜索功能必須能夠搜索多個實體(可以由用戶選擇)。我爲以下函數創建了一個RequestMapping,它允許我爲模型中的@Indexed類構建索引。構建多個指標與Hibernate Search的

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

比方說,我有兩個類(Profielwerkstuk和Begrip),我有註釋,並希望有索引。當@Indexed註釋添加到Profielwerkstuk類,但沒有到Begrip類並調用索引生成器URL,Profielwerkstuk得到正確和合理的時間內收錄(20秒左右),並在此指數搜索Profielwerkstukken工作完全正常。類似地,當@Indexed註釋被添加到Begrip類但不與Profielwerkstuk類,對於Begrip索引還創建正確和合理的時間內(10秒左右)。

將@Indexed類添加到Profielwerkstuk類和Begrip類並嘗試構建索引時,現在創建索引超過10小時而沒有完成(我在10小時後終止了它),問題就出現了。我預計索引者完成的任務將與首先構建Profielwerkstuk索引,然後構建Begrip索引相同,這兩項索引都將在合理的時間內完成測試。有沒有人有一個想法可能會導致我的索引器需要這麼長時間?

編輯: 根據要求添加Profielwerkstuk和Begrip的相關注釋部分。

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

Profielwerkstuk:

@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,並Onderzoeksvraag在Profielwerkstuk是不相關的Begrip 。 ContainerElement部分也可能有助於回答這個問題,因爲Profielwerkstuk和Begrip都有@IndexedEmbedded的ContainerElement字段。

ContainerElement:

public class ContainerElement extends Element { 

    @OneToMany(mappedBy="container", cascade = CascadeType.ALL) 
    @IndexedEmbedded(includePaths = { "content" }) 
    protected List<Element> elementen; 
} 

與其父類元素:

public class Element { 

    @Lob 
    @Field 
    private String content; 
} 
+1

這聽起來對我來說,你的兩個類有一個雙向關聯,你碰上指數化的循環:索引時則索引B的指數的等等......你可以發佈你的類的相關部分? – benzonico 2013-03-09 15:54:12

+0

沒有沒有周期是有一定限度的,因爲他用明確的_includePaths_ – Sanne 2013-03-09 19:29:17

回答

1

我想你可能會打HSEARCH-598,可以通過大幅降低由MassIndexer使用的線程數找出或在連接池中放置非常大的連接限制。另外不要忘記配置您的數據庫以允許多個連接。

如果是這樣的話,請在這個問題上發表評論,我們將它提升優先級..對不起,我沒有解決它尚未作爲迄今爲止提出的任何解決方案,對整個索引時壞的影響。

+0

這確實似乎是這個問題是相當低的。我使用MassFordexer文檔中描述的threadsForSubsequentFetching()和threadsT​​oLoadObjects(),現在構建索引確實完成了!我也將它添加爲bug報告的評論。 – 2013-03-10 20:47:27

+0

昨天好像問題解決了,但現在看來仍然存在。查看問題中的編輯。 – 2013-03-11 13:25:07

+0

你究竟做了什麼?你減少了線程?確保你確認你有足夠的連接。 – Sanne 2013-03-11 22:48:55