`
mozhenghua
  • 浏览: 319178 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

利用valueSource定义排序Score

阅读更多

  当lucene默认的文本相关性排序无法满足需要时,我们需要自定义文档相关性打分,从而可以影响文档排序,此时可以使用solr的valueSource插件实现自定义打分。

 

solrconfig.xml 中的配置样例:

 <valueSourceParser name="distScore" 
   class="com.dfire.tis.solrextend.valuesourceparser.ShopMultiCirclesGeoDIstValueSourceParser" >
     <lst name="params">
       <int name="firstCircle">5</int>
       <int name="secondCircle">10</int>
       <int name="thirdCircle">15</int>
       <str name="weightField">period_score</str>
     </lst>
 </valueSourceParser>

     这个配置是的目的是为默认按照距离远近排序的方式,为不同的商圈上的商家重新赋上权重,从而影响在商圈上的商家的排序前后,比如有些商家虽然按照距离来说应该排在后面,但是由于商家服务质量好,在打分上为该商家赋上一个较高的权重,从而可以让商家排名靠前。

 

Valuesource代码样例:

public class ShuffleValueSourceParser extends ValueSourceParser {
	private int mod;
	private float weight;

	@SuppressWarnings("all")
	public void init(NamedList args) {

		NamedList namedList = ((NamedList) args.get("params"));
		this.mod = (int) (namedList.get("mod"));
		this.weight = (float) namedList.get("weight");
	}

	@Override
	public ValueSource parse(FunctionQParser fp) throws SyntaxError {
		return new NumDocsValueSource();
	}

	private class NumDocsValueSource extends ValueSource {
		private FunctionValues fcVal = new DoubleDocValues(this) {
			@Override
			public double doubleVal(int doc) {
				return (doc % mod) * weight;
			}
		};

		@Override
		public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
			return fcVal;
		}

		public String name() {
			return "shuffle";
		}

		@Override
		public boolean equals(Object o) {
			return this.getClass() == o.getClass();
		}

		@Override
		public int hashCode() {
			return this.getClass().hashCode();
		}

		@Override
		public String description() {
			return name() + "()";
		}
	}
}

 

客户端查询样例:

AND+_val_:"{!func}distScore()

 

另外,solr还默认提供了一些其他的valueSource实现,例如:testfunc,ord,literal等,详细请查看org.apache.solr.search.ValueSourceParser

 

另外:valuesource也可以用在商品的nestdoc查询上,比如sku-spu中商品是绑定在sku上的,通过QueryParser{!parent}  来过滤spu记录,需要对命中结果用sku的价格来进行排序,可以使用以下查询语法:

 

_val_:"abs(price)" AND _query_:"{!parent score=Max which=type:p}card_degree:[100 TO *]"

 

通过price字段的绝对值作为子doc的socre分来排序,score=Max的意思是一个spu有多个sku匹配时候使用最大的值来排序,也可以使用score=Min取最小的值来排序

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics