Erro com o Hibernate Search [Resolvido]

1 resposta
rodrigo_flausino

Opa pessoal, blz! Eu ando tentando implementar o Hibernate Search usando como base um tutorial da Caelum (http://blog.caelum.com.br/hibernate-search-com-lucene/) só que na hora que eu tento fazer a busca não é gerado nenhum registro na List. Os meus códigos que estou usando são:

Classe TipoEmpresa

@Entity
@Table(name = "EMPRESAS_TIPO")
@Indexed
public class TipoEmpresa {

	@Id
	@Column(name = "ID", nullable = false)
	@SequenceGenerator(name = "EMPRESAS_TIPO_ID", sequenceName = "EMPRESAS_TIPO_ID")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "EMPRESAS_TIPO_ID")
	private int id;

	@Column(name = "TIPO", length = 10)
	@Field(index=Index.YES,store=Store.YES) 
	private String tipo;
}

Função que está no DAO:

public List<T> getTesteSearch2(Class<T> classe, String valorBusca,
			String colunaBanco) throws ParseException {
		Session sessao = factory.openSession();

		FullTextSession LuceneSession = Search.getFullTextSession(sessao);
	     
	    //String[] stopWords = {"de","do","da","dos","das","a","o","na","no","em"};   
	    QueryParser parser = new QueryParser(Version.LUCENE_36,"tipo",new BrazilianAnalyzer(Version.LUCENE_36));
	 
	    Query LuceneQuery = parser.parse(valorBusca);
	    FullTextQuery fullTextQuery = LuceneSession.createFullTextQuery(LuceneQuery, classe);   
	   
	    return fullTextQuery.list();   
		

	}

Estou usando a versão mais recente do Hibernate Search, que tem de colocar o Version.LUCENE_36 no começo dos parâmetros. Eu teria de implementar mais alguma coisa? Todos os exemplos que eu estou achando nos sites não funcionam, mesmo fazendo as “prováveis” adaptações necessárias. Eu queria implementar uma busca que ignorasse se a palavra é maiúscula/minúscula e os acentos, mas a maioria das soluções usando Criteria não funcionaram direito =S

1 Resposta

rodrigo_flausino

Eu consegui resolver o meu problema com algumas modificações simples. Decidi postar abaixo o código já alterado para ajudar outras pessoas que tenham o mesmo problema. Lembrando que a busca pega o início da palavra, buscando todas as opções (que "comece com"). Ainda devo analisar os impactos de usar esse tipo de estratégia, e pelo que eu li ontem em diversos fóruns, os programadores gostam de usar o Lucene e tem inclusive casos de uso com "milhões de registros" que fazem buscas mais rápidas (tendo um hardware decente).

Classe TipoEmpresa (gets e sets omitidos):
@Indexed
@Entity
@Table(name = "EMPRESAS_TIPO")
@Analyzer(impl = BrazilianAnalyzer.class)
public class TipoEmpresa {

	@Id
	@Column(name = "ID", nullable = false)
	@SequenceGenerator(name = "EMPRESAS_TIPO_ID", sequenceName = "EMPRESAS_TIPO_ID")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "EMPRESAS_TIPO_ID")
	private int id;

	@Field(name = "tipo", index = Index.YES, analyze = Analyze.YES, store = Store.YES)
	@Column(name = "TIPO", length = 10)
	private String tipo;
}
A função de busca (que gera um List que pode ser usado em tabelas usando TableModels). Repare que eu uso o "*" no final do parser, para pesquisar pelo termo que está no começo. Sem ele, acaba pegando só o mesmo valor (mas acredito que possa acabar buscando mais valores com o mesmo termo, mas devo testar depois):
public List<T> getTesteSearch2(Class<T> classe, String valorBusca,
			String colunaBanco) throws ParseException {
		Session sessao = factory.openSession();
		
		String searchQuery = valorBusca;
        QueryParser parser = new QueryParser(Version.LUCENE_36,colunaBanco, new BrazilianAnalyzer(Version.LUCENE_36));
        org.apache.lucene.search.Query luceneQuery;
        try {
            luceneQuery = parser.parse(colunaBanco + ":" + valorBusca + "*");
        }
        catch (ParseException e) {
            throw new RuntimeException("Unable to parse query: " + searchQuery, e);
        }
        FullTextSession ftSession = Search.getFullTextSession((sessao));
        org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery);

		return query.list();

	}
Os fontes acima são adaptações das dicas que peguei nos links à seguir: http://www.querydsl.com/static/querydsl/2.2.0/reference/html/ch02s05.html https://forum.hibernate.org/viewtopic.php?f=9&t=1004199
Criado 17 de junho de 2013
Ultima resposta 18 de jun. de 2013
Respostas 1
Participantes 1