Pesquisa de hibernato - Pesquisa em determinado escopo
-
21-09-2019 - |
Pergunta
Digamos que eu tenha aulas seguintes. (apenas coisas mais importantes incluídas)
public class Client {
/* Some Properties */
}
public class ClientDocumentAssociation {
@ManyToOne
private Client client;
/* Some Properties */
}
@Indexed
public class Document {
@OneToOne
private ClientDocumentAssociation clientAssociation;
@Field(name = "text")
private String text;
/* Some Properties */
}
Minha pesquisa básica de documentos é assim:
public List<AbstractDocument> searchDocuments(String text) {
if (text == null) {
return newArrayList();
}
FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvider.get());
MultiFieldQueryParser parser = new MultiFieldQueryParser(DOCUMENT_FIELDS, new StandardAnalyzer());
parser.setDefaultOperator(Operator.AND);
FullTextQuery ftq;
try {
Query q = parser.parse(text + "*");
ftq = ftem.createFullTextQuery(q, Document.class);
ftq.setMaxResults(20);
List<AbstractDocument> results = ftq.getResultList();
return results;
} catch (ParseException e) {
e.printStackTrace();
}
return newArrayList();
}
Agora, quero poder procurar documentos, mas não no escopo de todo o índice, mas apenas encontre documentos que pertencem ao determinado cliente. A única coisa que me vem à mente é adicionar a associação ao índice e adicionar ID do cliente ao campo apropriado na pesquisa. Mas isso não parece certo. Deve haver outra opção e é isso que estou pedindo.
Solução
Por que sua ideia inicial parece estar errada? De fato, indexar todos os dados necessários para sua pesquisa é a maneira recomendada de fazer isso. É para isso que existe @IndexedEmbedded. A indexação dos dados também fornecerá mais flexibilidade para alterações na consulta e/ou novas consultas.
Outras dicas
A outra maneira de fazer isso é usar filtros. Um filtro pode ser aplicado a uma pesquisa do Lucene. Hibernate suporta a adição de filtros como anotações e permitindo -os no tempo de execução
Ok, eu realmente encontrei uma solução. A coisa que eu (e qualquer pessoa que estava procurando a solução do mesmo problema) é necessária é a criação de critérios para o FullTextQuery.
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);
Parece funcionar bem :)