Erro Compass + Lucene (RESOLVIDO)

1 resposta
foxpv

Bom dia pessoal!
Estou utilizando o Lucene para realizar indexação e bsca de dados, porém surgiu um problema onde a solulção mais viável seria armazenar o índice do lucene no banco de dados, depois de algumas pesquisas vi que o compass implementa o Directory do Lucene para dar suporte a esse armazenamento no banco. Li a documentação e fiz exatamente o que pediram. Estou usando o PostgreSQL e o Spring, além de JPA/Hibernate. No momento que eu tento criar um IndexWriter do Lucene ocorro o seguinte erro:

org.apache.lucene.index.CorruptIndexException: failed to locate current segments_N file
	at org.apache.lucene.index.IndexFileDeleter.<init>(IndexFileDeleter.java:214)
	at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1109)
	at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:686)
	at br.com.aggora.ulisses.dao.LuceneDAO.indexaPessoa(LuceneDAO.java:63)
	at br.com.aggora.ulisses.dao.PessoaDAO.salvaIndexa(PessoaDAO.java:158)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy31.salvaIndexa(Unknown Source)
	at br.com.aggora.ulisses.mb.PessoaAlocadaBean.salvar(PessoaAlocadaBean.java:1268)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:152)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.aggora.ulisses.filter.EncodingFilter.doFilter(EncodingFilter.java:60)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.acegisecurity.securechannel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:138)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
	at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.securechannel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:138)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.captcha.CaptchaValidationProcessingFilter.doFilter(CaptchaValidationProcessingFilter.java:110)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
	at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
	at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

Esse erro ocorre no lucene quando ele não acha o local onde estão/estarão armazenados os índices que no caso é o bd. (Eu já criei a tabela do compass para armazenar as informações).

O código onde eu faço a indexação é o seguinte:

JdbcDirectory jd = new JdbcDirectory(dataSource,new PostgreSQLDialect(),"tb_indice");
		Connection conn = DataSourceUtils.getConnection(dataSource);
		//conn.setAutoCommit(false);
		try{
			IndexWriter writer = null;
			try{
				writer = new IndexWriter(jd, new BrazilianAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED);
			}
			catch(Exception e){//se ainda não existir a pasta com os índices
				writer = new IndexWriter(jd, new BrazilianAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
			}
			//DESINDEXANDO ARTIGO CASO SEJA UMA ATUALIZAÇÃO
			if(pessoa.getId() != null){
				writer.deleteDocuments(new Term(Constantes.ID_PESSOA, String.valueOf(pessoa.getId().toString())));
			}
			
			Document doc = new Document();
			Field tipoPessoa = new Field(Constantes.TIPO_PESSOA, tipo, Field.Store.YES, Field.Index.ANALYZED);
			doc.add(tipoPessoa);
			this.preencheDocumentPessoa(doc, pessoa, properties);
			writer.addDocument(doc);
			writer.optimize();
			writer.close();
			//DataSourceUtils.commitConnectionIfPossible(conn);
		}
		catch(Exception e){
			//DataSourceUtils.safeRollbackConnectionIfPossible(conn);
			throw e;
		}
		finally{
			//DataSourceUtils.releaseConnection(conn);

		}

Quano eu armazenava o índice diretamente no disco funcionava normalmente.

Alguém sabe o que pode estar acontecendo? Ou então tem alguma outra dica sobre outras maneiras de armazenar o índice do lucene no banco?

Já fiz algumas pesquisas no google e atém tiveram algumas pessoas com o prob, mas não consegui ver a solução.

1 Resposta

foxpv

Consegui resolver o problema.

Eu li denovo a documentação do compass com mais atencção e vi que eles falam lá pra quando estiver utilizando o spring tem que usar o TransactionAwareDataSourceProxy para as operações no banco fazerem parte da transação do spring.

Abraços.

Criado 10 de novembro de 2009
Ultima resposta 10 de nov. de 2009
Respostas 1
Participantes 1