Some usecase requires more than a simple object to string translation when mapping a property to a Lucene index. To give you most of the flexibility you can also implement a bridge as a FieldBridge. This interface give you a property value and let you map it the way you want in your Lucene Document.This interface is very similar in its concept to the Hibernate™UserType.
You can for example store a given property in two different document fields
/**
* Store the date in 3 different field year, month, day
* to ease Range Query per year, month or day
* (eg get all the elements of december for the last 5 years)
*
* @author Emmanuel Bernard
*/
public class DateSplitBridge implements FieldBridge {
private final static TimeZone GMT = TimeZone.getTimeZone("GMT");
public void set(String name, Object value, Document document, Field.Store store,
Field.Index index, Float boost) {
Date date = (Date) value;
Calendar cal = GregorianCalendar.getInstance( GMT );
cal.setTime( date );
int year = cal.get( Calendar.YEAR );
int month = cal.get( Calendar.MONTH ) + 1;
int day = cal.get( Calendar.DAY_OF_MONTH );
//set year
Field field = new Field( name + ".year", String.valueOf(year), store, index );
if ( boost != null ) field.setBoost( boost );
document.add( field );
//set month and pad it if needed
field = new Field( name + ".month", month < 10 ? "0" : "" +
String.valueOf(month), store, index );
if ( boost != null ) field.setBoost( boost );
document.add( field );
//set day and pad it if needed
field = new Field( name + ".day", day < 10 ? "0" : "" +
String.valueOf(day), store, index );
if ( boost != null ) field.setBoost( boost );
document.add( field );
}
}
//property@FieldBridge(impl = DateSplitBridge.class)
private Integer length;