I wrote small function query which returns constant value base on key passed in.
It works great for the first request, but when I change qk it doesn't actually return anything new because it is cached.
Is there any way to force solr not to cache this function query results, or make qk key for the cache, so if I change qk it will search again?
import java.io.IOException;
import java.util.Map;
import org.apache.lucene.index.IndexReader;
import org.apache.solr.search.function.DocValues;
import org.apache.solr.search.function.ValueSource;
public class ConstValueSource extends ValueSource {
final Map<String, Float> constants;
final String qk;
final String field;
public ConstValueSource(Map<String, Float> constants, String qk, String field) {
this.constants = constants;
this.qk=qk;
this.field=field;
}
public DocValues getValues(Map context, IndexReader reader) throws IOException {
return new DocValues() {
public float floatVal(int doc) {
return constants.get(qk);
}
public int intVal(int doc) {
return (int)floatVal(doc);
}
public long longVal(int doc) {
return (long)floatVal(doc);
}
public double doubleVal(int doc) {
return (double)floatVal(doc);
}
public String strVal(int doc) {
return Float.toString(floatVal(doc));
}
public String toString(int doc) {
return description();
}
};
}
@Override
public String description() {
return field + "_" + qk;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof ConstValueSource))
return false;
ConstValueSource other = (ConstValueSource) o;
return this.field.equals(other.field) && this.qk.equals(other.qk);
}
@Override
public int hashCode() {
return field.hashCode() * qk.hashCode();
}
}
Here is my value parser
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.search.FunctionQParser;
import org.apache.solr.search.ValueSourceParser;
import org.apache.solr.search.function.ValueSource;
public class ConstSourceParser extends ValueSourceParser {
public void init(NamedList namedList) {}
public ValueSource parse(FunctionQParser fqp) {
try {
SolrParams paramters = fqp.getParams();
return new ConstValueSource(data, paramters.get("qk"), "qk");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
- Ok it was issue with old cache, after updating description and clearing cache it start working.
Is there any way to filter by response?