Если у вас есть поле строкового типа, но вы хотите отсортировать по номерам и применить к нему запрос ранга. у вас должно быть преобразовано строковое поле в числовое поле, но здесь без конвертирующего поля вы можете реализовать ранжированный запрос к полю и применить сортировку как число.
Добавить или создать собственный @FieldBridge на поле.
@Field(index=Index.YES,analyze=Analyze.NO,store=Store.YES)
@FieldBridge(impl=StringToNumberBridge.class)
private String currentCtc;
Предположим, вы хотите искать поле currentCtc как число, но это строковое поле. Вы можете реализовать Rang Query в поле currentCtc.
public class StringToNumberBridge implements TwoWayStringBridge {
Logger logger=Logger.getLogger(StringToNumberBridge.class);
public static String PADDING_PROPERTY = "padding";
private int padding = 7; //default
public String objectToString(Object object) {
try {
if(object!=null)
{
String rawInteger = ((String) object).toString();
String decimalPoint="";
if(rawInteger.matches("\\d*\\.\\d+"))
{
decimalPoint=rawInteger.substring(rawInteger.indexOf("."));
rawInteger=rawInteger.substring(0,rawInteger.indexOf("."));
System.out.println(decimalPoint);
System.out.println(rawInteger);
}
if (rawInteger.length() > padding)
throw new IllegalArgumentException("Try to pad on a number too big");
StringBuilder paddedInteger = new StringBuilder();
for (int padIndex = rawInteger.length(); padIndex < padding; padIndex++)
{
paddedInteger.append('0');
}
return paddedInteger.append(rawInteger).append(decimalPoint).toString();
}
else {
return "";
}
//return object.toString();
}
catch (Exception e) {
logger.error("NumberFormateException:::::::::::"+e);
return null;
}
}
public Object stringToObject(String stringValue) {
return Double.valueOf(stringValue);
}
}
У вас есть поле строки индексации с таким же заполнением, как и число.
Примените Rang Query к полю String, но оно работает как число.
booleanQuery.must(qb.range().onField("currentCtc").below(25000).createQuery());
Применить сортировку по строковому полю как число
SortField field = new SortField("currentCtc".trim(), SortField.DOUBLE,true);