봄철 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;
}
당신의 두 클래스가 양방향 연관성을 가지고 있고 인덱싱 사이클에 빠지게 들린다 : A를 인덱스 할 때 A를 인덱스하는 B를 인덱스하는 등 ... 클래스의 관련 부분을 게시 할 수 있습니까? ? – benzonico
아니요 제한이 있으므로주기가 없습니다. 명시 적으로 사용하고 있기 때문에 상당히 낮습니다 _includePaths_ – Sanne