SOLR中实现自定义评分函数FunctionQuery

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>

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值