Hibernate Search - ricerca nel determinato campo di applicazione
-
21-09-2019 - |
Domanda
Diciamo che ho seguito corsi. (Solo le cose più importanti inclusi)
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 */
}
La mia ricerca di base del documento è simile a questo:
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();
}
Ora, voglio essere in grado di cercare i documenti, ma non nel campo di applicazione l'intero indice, ma basta trovare i documenti che appartengono alla data del client. L'unica cosa che mi viene in mente è l'aggiunta l'associazione per l'indice e aggiungere client id al campo appropriato alla ricerca. Ma questo non mi sembra giusto. Ci deve essere un'altra opzione ed è quello che sto chiedendo.
Soluzione
Perché il vostro idea iniziale sembra essere sbagliato? Infatti indicizzare tutti i dati necessari per la ricerca è il modo consigliato di fare questo. Questo è ciò che è lì per @IndexedEmbedded. L'indicizzazione dei dati vi darà anche una maggiore flessibilità per le modifiche nella query e / o nuove query.
Altri suggerimenti
L'altro modo si può fare questo è quello di utilizzare i filtri. Un filtro può essere applicato a una ricerca Lucene. Hibernate supporta l'aggiunta di filtri come annotazioni e consentendo loro in fase di esecuzione
Ok realtà ho trovato una soluzione. La cosa che ho (e chiunque fosse alla ricerca di una soluzione dello stesso problema) necessaria è l'impostazione di criteri per la FullTextQuery.
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);
Sembra funzionare bene :)