自定义FunctionQuery ConstValueSource

时间:2013-10-22 21:36:42

标签: solr solr-query-syntax

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

它适用于第一个请求,但是当我更改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 个答案:

答案 0 :(得分:0)

您可以使用元{!cache=false}

控制缓存

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

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

更多信息: