SOLR项目应用中,需要对搜索结果自定义排序,比如对一些质量好的网站权重高点。这里就需要定义一个自定义的valueSourceParser来实现。
先实现一个自定义的:B258DynamicSourceParser。主要代码如下:
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中定义该插件并引用。
<valueSourceParser name="b258dynamic" class="org.lifeba.lucene.queries.function.B258DynamicSourceParser" />
在对应的solr.StandardRequestHandler节点中通过下面代码来引用。
<lst name="defaults"> <str name="defType">258</str> <str name="qf">text</str> <str name="tie">0.8</str> <str name="boost">br</str> <str name="dynamic">b258dynamic(domain,dd)</str> </lst>