Пользовательский FunctionQuery ConstValueSource
Я написал небольшой запрос функции, который возвращает константу на основе переданного ключа.
Он отлично работает для первого запроса, но когда я изменяю 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;
}
}
}
- Хорошо, это была проблема со старым кешем, после обновления описания и очистки кеша он начал работать.
Есть ли способ отфильтровать по ответу?
1 ответ
Вы можете контролировать кеширование с мета {!cache=false}
Например: fl={!cache=false}field(your_const_field)
И в запросе фильтра: fq={!frange l=2 cache=false}field(your_const_field)
Дополнительная информация: