如果您有字符串类型字段,但您想按数字排序并对其应用 rang 查询。您必须将字符串字段转换为数字字段,但在这里无需转换字段,您可以在字段上实现范围查询并像数字一样应用排序。
在字段上添加或创建自定义 @FieldBridge。
@Field(index=Index.YES,analyze=Analyze.NO,store=Store.YES)
@FieldBridge(impl=StringToNumberBridge.class)
private String currentCtc;
假设您想搜索 currentCtc 字段为数字,但它是字符串字段。您可以在 currentCtc 字段上实现 Rang Query。
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,但它的工作方式类似于数字。
booleanQuery.must(qb.range().onField("currentCtc").below(25000).createQuery());
将字符串字段排序为数字
SortField field = new SortField("currentCtc".trim(), SortField.DOUBLE,true);