2012-04-26 15 views
6

In una delle mie applicazioni, devo eseguire una ricerca su più campi/colonne. È una ricerca avanzata e ci sono oltre 20 campi con cui un utente può cercare i risultati. Ad esempio, un utente può cercare per le prenotazioni in baseRicerca avanzata Utilizzo di Hibernate Search

  1. Prenotazione id
  2. Nome passeggeri
  3. passeggeri Età
  4. Dalla Posizione
  5. Per Località
  6. Prenotazioni Stato
  7. Nome Compagnia aerea

e 13 di questi campi.

Sto cercando di capire se

  1. Hibernate Search può e deve essere utilizzato qui? Se é cosi, come? Non sono riuscito a trovare un esempio per una ricerca così complessa che utilizza la ricerca in ibernazione.

  2. Invece di Hibernate search, posso semplicemente utilizzare Hibernate e forse progettare una ricerca multi-thread in base al numero di parametri. Sarebbe una buona idea?

  3. È possibile utilizzare i filtri di ibernazione qui?

Qualcuno può fornire input o collegamenti di riferimento?

+0

Si aspetta che l'utente inserisca i propri criteri di ricerca in un campo e quindi verifichi contro più colonne? O separare i campi di ricerca per ogni colonna? –

+0

I suoi campi separati per ogni colonna. –

risposta

2

Per questi tipi di query, generalmente utilizzo una query Criteria con un oggetto modulo. Quindi controllo per null in ogni campo modulo passato, e se non è null, quindi aggiungere un altro Restriction nella query, utilizzando tale campo. L'utilizzo di una query Criteria mantiene il codice Java molto pulito ed elimina la concatenazione di stringhe disordinata. Un esempio per il tuo caso:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

Ciao @Aaron, grazie per la risposta. Il mio problema è che i dati sono distribuiti su circa 25 tabelle. Quindi, se sto usando Criteria, sarebbe un'enorme affermazione con Joins. Questo è qualcosa che voglio evitare di avere un'implementazione pulita. quello che stai proponendo funziona perfettamente se devo dire 5-6 campi su cui cercare. –

+0

Se hai le entità di Hibernate impostate con le relazioni, Hibernate si prenderà cura di tutti questi join per te e sarai in grado di utilizzare la suddetta strategia su quegli altri tavoli. Pensa in Hibernate, non in SQL, e lascia che lo strumento faccia il lavoro per te. – atrain

+0

Non sono sicuro di aver capito bene. Lasciatemi fare un esempio, sto cercando "Bookings" dove "Trip Type" è "a senso unico". Il tipo di viaggio è incorporato in una classe che si trova a 6 livelli sotto la classe "Prenotazione". Quindi dovrei effettivamente cercare sul tipo di viaggio e non sulla classe di prenotazione. Ora ci possono essere 20 parametri di questo tipo su cui vorrei cercare che sono incorporati a vari livelli dalla classe di prenotazione. Se devo farlo usando un criterio, dovrei unire tutti i tavoli a questi livelli che penso sia molto ingombrante. –

0

Sì, la ricerca di ibernazione sarà molto utile in questo caso. Puoi usare i filtri, ma la ricerca di ibernazione ha anche dei filtri.

2

Penso che la vostra decisione dovrebbe essere basata sul requisito di capacità. La query Hibernate ordinaria potrebbe essere sufficiente per la ricerca su quei molti campi.

Hibernate Search consente di ottenere rapidamente la query di ricerca per una grande quantità di dati, utilizzando l'indice inverso. Ad esempio, dovresti caricare il tuo database con la capacità che ti aspetti nei prossimi 5 anni. Se la tua normale query Hibernate è considerata accettabile, penso che dovresti rimanere con la normale query Hibernate.

È possibile introdurre la ricerca di ibernazione anche in una fase successiva.

MODIFICA: È possibile scegliere di non utilizzare Ricerca Hibernte, scendere al livello inferiore e utilizzare invece Apache Lucene. Puoi generare il tuo indice Apache Lucene. In questo modo non devi preoccuparti di quale campo cercare i record perché avrai il pieno controllo su come il processo di tokenizzazione e indicizzazione. Se si sceglie questo modo, è possibile memorizzare il nome di riga e colonna come parte dei risultati della ricerca.

+0

Grazie per la tua risposta @Daniel. La mia preoccupazione qui è la quantità di codice complesso che dovrebbe essere scritto per generare la query. Sto cercando da oltre 25 tabelle e il numero di join richiesti per essere scritti manualmente sarebbe molto incline agli errori. –

+0

Preoccuparti del codice complesso? Scendi di un livello fino ad Apache Lucene. Non è necessario creare una query di ibernazione, ma interrogare sull'indice di Lucene creato dall'utente. L'unico inconveniente è che è necessario comprendere la tecnologia sottostante di Lucene. –

Problemi correlati