Opa pessoal, blz novamente! Seguinte: nos últimos 2 dias andei tentando implementar o Hibernate Search, só que nas últimas horas andei percebendo que o sistema ainda não é tão legal quanto eu achava que seria (ou eu não estou sabendo implementar direito). O exemplo do meu tópico anterior ( http://www.guj.com.br/java/301354-erro-com-o-hibernate-search-resolvido) não englobava fazer um teste inicial de uma busca começando com a “letra A”. Se eu quisesse, por exemplo, listar todos os clientes de uma empresa que começam com a letra A já inviabiliza o uso do Search, por conta da letra usar uma “stop word”, que está presente dentro do Analyser. Se eu tento fazer algo assim:
luceneQuery = queryBuilder.keyword().onField(colunaBanco)
.matching(valorBusca).createQuery();
Ocorre um erro por conta do “A” ser uma stop word, tipo “do”, “da”, etc. Até tentei adaptar o tutorial do blog da Caelum (http://blog.caelum.com.br/hibernate-search-com-lucene/) e trocar o Analyser, mas também não funcionou. O stacktrace do erro gera assim:
Então gostaria de alguma ajuda de quem conseguiu implementar o Hibernate Search. Vocês conseguiram fazer buscas usando uma “letra A”? Isso é realmente impossível? É possível? Se eu tenho um valor do tipo “A Relíquia”, ele acha o valor se eu procuro pela letra “R”, mas não consegue pela letra “A” (do meu exemplo do tópico anterior) e gera o erro se eu faço um lucenequery com o tipo acima. Se alguém souber e quiser passar uma dica, agradeço imensamente.
O meu código inteiro da função tinha ficado assim:
[code]public List getDadosLucene(Class classe, String valorBusca,
String colunaBanco, int tipoBusca) throws ParseException {
Session sessao = factory.openSession();
//String[] words = { "de", "do", "da", "dos", "das", "o", "na", "no","em" };
Set<String> set = new HashSet<String>();
set.add("de");
set.add("do"); // ,"da","dos","das","o","na","no","em"
QueryParser parser = new QueryParser(Version.LUCENE_36, colunaBanco,
new StopAnalyzer(Version.LUCENE_36, set));
org.apache.lucene.search.Query luceneQuery;
FullTextSession ftSession = Search.getFullTextSession((sessao));
QueryBuilder queryBuilder = ftSession.getSearchFactory()
.buildQueryBuilder().forEntity(classe).get();
try {
switch (tipoBusca) {
case Funcoes.BUSCA_IGUAL:
luceneQuery = parser.parse(colunaBanco + ":" + valorBusca + "");
break;
case Funcoes.BUSCA_COMECE_COM:
luceneQuery = parser
.parse(colunaBanco + ":" + valorBusca + "*");
break;
case Funcoes.BUSCA_CONTENHA:
luceneQuery = queryBuilder.keyword().onField(colunaBanco)
.matching(valorBusca).createQuery();
break;
case Funcoes.BUSCA_TERMINE_COM:
luceneQuery = parser
.parse(colunaBanco + ":*" + valorBusca + "");
break;
default:
luceneQuery = parser.parse(colunaBanco + ":" + valorBusca + "");
}
} catch (ParseException e) {
throw new RuntimeException("Unable to parse query: " + valorBusca,
e);
}
org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery);
return query.list();
}[/code]