0

我写了一个小函数查询,它根据传入的键返回常量值。

它适用于第一个请求,但是当我更改 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;
    }
  }
}
  • 好的,这是旧缓存的问题,在更新描述并清除缓存后它开始工作。

有没有办法按响应过滤?

4

1 回答 1

0

您可以使用元控制缓存{!cache=false}

例如:fl={!cache=false}field(your_const_field)

在过滤器查询中:fq={!frange l=2 cache=false}field(your_const_field)

更多信息:

于 2014-08-07T19:27:15.700 回答