文字列型のフィールドがあるが、数値で並べ替えて、それにrangクエリを適用したい場合。文字列フィールドを数値フィールドに変換する必要がありますが、ここではフィールドを変換せずに、フィールドにrangクエリを実装し、数値のように並べ替えを適用できます。
フィールドにカスタム@FieldBridgeを追加または作成します。
@Field(index=Index.YES,analyze=Analyze.NO,store=Store.YES)
@FieldBridge(impl=StringToNumberBridge.class)
private String currentCtc;
currentCtcフィールドを数値として検索したいが、それは文字列フィールドであるとします。currentCtcフィールドにRangQueryを実装できます。
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);
}
}
数字と同じようにパディングされたインデックス文字列フィールドがあります。文字列フィールドにRangQueryを適用しますが、数値のように機能します。
booleanQuery.must(qb.range().onField("currentCtc").below(25000).createQuery());
文字列フィールドに数値として並べ替えを適用する
SortField field = new SortField("currentCtc".trim(), SortField.DOUBLE,true);