2013-03-09 2 views
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!"); 
} 

내가 주석을 달고 색인을 생성하려는 두 개의 클래스 (Profielwerkstuk and Begrip)가 있다고 가정 해 보겠습니다. @Indexed 주석을 Profielwerkstuk 클래스에 추가하지만 Begrip 클래스에는 추가하지 않고 색인 작성기 URL을 호출하면 Profielwerkstuk는 적절한 시간 (20 초 정도) 내에 올바르게 색인화되고이 색인에서 Profielwerkstukken을 검색하면 완벽하게 정상적으로 작동합니다. 마찬가지로 @Indexed 주석이 Begiel 클래스에 추가되지만 Profielwerkstuk 클래스에는 추가되지 않으면 Begrip에 대한 인덱스도 적절한 시간 (10 초 정도) 내에 올바르게 작성됩니다.

Profielwerkstuk 클래스와 Begrip 클래스에 @Indexed 클래스를 추가하고 인덱스를 작성하려고하면 문제가 발생합니다. 이제 인덱스를 완성하지 않고 10 시간 이상 실행했습니다 (10 시간 후에 종료 됨). 색인 작성자가 수행해야 할 작업은 먼저 Profielwerkstuk 색인을 작성한 다음 Begip 색인을 작성하는 것과 같을 것이므로 모두 합리적인 시간 내에 완료되도록 테스트됩니다. 내 인덱서가 너무 오래 걸릴 수있는 아이디어가 누구에게 있습니까?

편집 : 요청시 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 관련되지 않으며, Profielwerkstuk에서 Onderzoeksvraag이 Begrip 관련이없는 것으로 여기에 추가 할 수 있습니다

. Profielwerkstuk와 Begrip 모두 @IndexedEmbedded을 가진 ContainerElement 필드를 가지기 때문에 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

당신의 두 클래스가 양방향 연관성을 가지고 있고 인덱싱 사이클에 빠지게 들린다 : A를 인덱스 할 때 A를 인덱스하는 B를 인덱스하는 등 ... 클래스의 관련 부분을 게시 할 수 있습니까? ? – benzonico

+0

아니요 제한이 있으므로주기가 없습니다. 명시 적으로 사용하고 있기 때문에 상당히 낮습니다 _includePaths_ – Sanne

답변

1

난 당신이 HSEARCH-598을 타격 할 수 있다고 생각, 당신은 크게 MassIndexer에 의해 사용되는 스레드의 수를 줄여 찾을 수 있습니다 또는 연결 풀에 매우 큰 연결 제한을 설정합니다. 또한 많은 연결을 허용하도록 데이터베이스를 구성하는 것을 잊지 마십시오.

이 경우 문제에 대해 의견을 말하면 우선 순위가 높아집니다. 미안하지만 지금까지 제안 된 솔루션이 전반적인 색인 생성 시간에 나쁜 영향을 미치므로 아직 해결하지 못했습니다.

+0

실제로 문제가있는 것으로 보입니다. MassIndexer 문서에 설명 된대로 threadsForSubsequentFetching() 및 threadsToLoadObjects()를 사용 했으므로 인덱스를 실제로 완성합니다! 또한 버그 보고서에 주석으로 추가 할 것입니다. –

+0

어제는 문제가 해결 된 것 같았지만 지금은 여전히 ​​남아있는 것처럼 보입니다. 질문에서 수정 사항을 참조하십시오. –

+0

정확히 무엇을 했습니까? 너는 실을 줄 였니? 연결이 충분한 지 확인하십시오. – Sanne

관련 문제