Posts by tag: lucene

by in / NHibernate
No peoples think this is good

Come indicizzare una proprietà di un tipo non primitivo in Lucene.Net con un FieldBridge di NHibernate.Search

Può essere utile a volte indicizzare con Lucene.Net una proprietà di un oggetto che non sia una stringa o un tipo primitivo, pensiamo ad esempio alla lista di categorie di un prodotto. Per casi come questo e laddove l’accesso ai dati viene fatto con NHibernate posso raggiungere il risultato desiderato utilizzando un FieldBridge di NHibernate.Search ed un po’ di reflection:

Il FieldBridge permette a NHibernate.Search di indicizzare con Lucene il contenuto di una proprietà qualora non fosse coerente utilizzare il metodo ToString() (quasi mai per i tipi non primitivi). Analizzando il codice sopra riportato si può notare come vengano passati al FieldBridge due parametri: il tipo di oggetto ed il nome della proprietà da indicizzare (righe 38-44). Con questi due parametri ed utilizzando l’utility PropertyReflector (classe di utilità scritta da Guy Mahieu per fare “deep-reflection” di proprietà) viene recuperato il valore da salvare nell’indice di Lucene. Il FieldBridge in oggetto riesce ad indicizzare sia oggetti singoli (righe 31-34) sia collezioni verificandone il tipo ed utilizzando l’interfaccia IEnumerator (righe 11-30). Qui sotto possiamo notare l’utilizzo dell’attributo per una proprietà di tipo IList<T>.

Nota: il PropertyBridge visto in questo esempio nasce da una esigenza specifica e per questo motivo non ricopre tutte le casistiche possibili.

/ Read Article /
by in / NHibernate
No peoples think this is good

Lucene.Net: indicizzare nullable date con un FieldBridge custom

L’altro giorno mi è capitato di dover effettuare con Lucene delle ricerche per un intervallo di date (data inizio e data fine). Siccome le date in questione potevano essere nulle si poneva il problema di come indicizzarle perchè fossero confrontabili con i valori forniti dalla ricerca (esempio minore di e maggiore di…).

Non potendo rinunciare al valore nullo sul database ho pensato di intervenire al momento dell’indicizzazione dell’entità andando a sostituire il valore nullo con un valore di default che fosse uguale al valore minimo di DateTime per la data di inizio e al valore massimo di DateTime per la data di fine.

Avvalendomi dell’aiuto di NHibernate.Search ho realizzato un FieldBridge custom che potesse intervenire nel momento dell’indicizzazione della mia entità. Un FieldBridge non è altro che un “codec” da object a string che consente di indicizzare il contenuto di una proprietà (Object To String) e di recuperarne il valore originale dall’indice (String To Object). Ecco il codice:

Per utilizzare questo FieldBridge è sufficiente decorare con un attributo la proprietà di tipo DateTime che si vuole indicizzare come nell’esempio di codice seguente:

/ Read Article /