public class B258DynamicSourceParser extends ValueSourceParser{
public ValueSource parse(FunctionQParser fp) throws SyntaxError {
String first = fp.parseArg();
String second = fp.parseArg();
ValueSource v1 = getValueSource(fp, first);
return new B258DynamicSource(v1,second);
}
public ValueSource getValueSource(FunctionQParser fp, String arg) {
if (arg == null) return null;
SchemaField f = fp.getReq().getSchema().getField(arg);
if (f.getType().getClass() == DateField.class) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Can't use ms() function on non-numeric legacy date field " + arg);
}
return f.getType().getValueSource(f, fp);
}
}
同时定义一个B258DynamicSource类。
public class B258DynamicSource extends ValueSource{
public String str;
public ValueSource field;
public B258DynamicSource(ValueSource v1,String str){
this.field = v1;
this.str = str;
}
@Override
public FunctionValues getValues(Map context,
AtomicReaderContext readerContext) throws IOException {
final FunctionValues fieldVals = field.getValues(context, readerContext);
return new FloatDocValues(this) {
@Override
public float floatVal(int doc) {
String domain = fieldVals.strVal(doc);//根据domain做不同的权重加权
float f = 10f;
return f;
}
@Override
public String toString(int doc) {
return name() + '(' + fieldVals.strVal(doc) + ')';
}
};
}
@Override
public boolean equals(Object o) {
// TODO Auto-generated method stub//重要
return true;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String description() {
return name();
}
public String name() {
return "b258dynamic";
}
}
定义好了Funtion后,需要在solrconfig.xml中定义该插件并引用。