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:
The query string 'A' applied on field 'tipo' has no meaningfull tokens to be matched. Validate the query input against the Analyzer applied on this field
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:
public List<T> getDadosLucene(Class<T> 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();
}