我写了一个小函数查询,它根据传入的键返回常量值。
它适用于第一个请求,但是当我更改 qk 时,它实际上并没有返回任何新内容,因为它已被缓存。
有没有办法强制solr不缓存这个函数查询结果,或者为缓存设置qk键,所以如果我改变qk它会再次搜索?
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();
}
}
这是我的值解析器
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;
}
}
}
- 好的,这是旧缓存的问题,在更新描述并清除缓存后它开始工作。
有没有办法按响应过滤?