Thanks a lot for your reply, Chris. I was trying to sort the query result by the Datefunction, by passing q={!boost b=dateDeboost()}title:test to the /select request-handler.
Before, my custom DateFunction is like this: public class DateFunction extends FieldCacheSource { private static final long serialVersionUID = 6752223682280098130L; private static long now; public DateFunction(String field) { super(field); now = System.currentTimeMillis(); } @Override public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException { long[] times = cache.getLongs(readerContext.reader(), field, false); final float[] weights = new float[times.length]; for (int i = 0; i < times.length; i++) { weights[i] = ScoreUtils.getNewsScoreFactor(now, times[i]); } return new FunctionValues() { @Override public float floatVal(int doc) { return weights[doc]; } }; } } It calculate every documet's date-weight, but at the same time , it only need the one doc's date-weight, so it run slowly. When I see the source code of recip function in org.apache.solr.search.ValueSourceParser, like this: addParser("recip", new ValueSourceParser() { @Override public ValueSource parse(FunctionQParser fp) throws SyntaxError { ValueSource source = fp.parseValueSource(); float m = fp.parseFloat(); float a = fp.parseFloat(); float b = fp.parseFloat(); return new ReciprocalFloatFunction(source, m, a, b); } }); and in the ReciprocalFloatFunction, it get the value like this: @Override public FunctionValues getValues(Map context, AtomicReaderContext readerContext) throws IOException { final FunctionValues vals = source.getValues(context, readerContext); return new FloatDocValues(this) { @Override public float floatVal(int doc) { return a/(m*vals.floatVal(doc) + b); } @Override public String toString(int doc) { return Float.toString(a) + "/(" + m + "*float(" + vals.toString(doc) + ')' + '+' + b + ')'; } }; } So I think this is what I want. When calculate a doc's date-weight, I needn't "cache.getLongs(xxxxx)", instead, I should "source.getValues(xxx)" Therefore I change my code, but when fp.parseValueSource(), it throws an error like this: org.apache.solr.search.SyntaxError: Expected identifier at pos 12 str='dateDeboost()' Do I describe clearly this time? Thanks again! sling -- View this message in context: http://lucene.472066.n3.nabble.com/In-a-functon-query-I-can-t-get-the-ValueSource-when-extend-ValueSourceParser-tp4103026p4103207.html Sent from the Solr - User mailing list archive at Nabble.com.