文字列型のフィールドがありますが、数値型でソートして、それに対して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 on Stringフィールドを適用しますが、数字のように機能します。
booleanQuery.must(qb.range().onField("currentCtc").below(25000).createQuery());
は数
私が使用しているだろうが、NumericFieldが3.3 http://docs.jboss.org/hibernate/まで導入されなかったものだ
SortField field = new SortField("currentCtc".trim(), SortField.DOUBLE,true);
として文字列フィールドに並べ替えの適用しますsearch/3.2/api/org/hibernate/search/annotations/http://docs.jboss.org/hibernate/search/3.3/api/org/hibernate/search/annotations/ =) – jakob
アップグレードに興味があるかもしれませんNumericFieldは範囲クエリのパフォーマンスを向上させるため、http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/ap i/all/org/apache/lucene/search/NumericRangeQuery.html – jpountz
あなたは正しいです。私はそれを最終的にやります。ありがとう! – jakob