【一】自定义评分

CustomScoreQuery类

 

构造函数

 

Constructor Summary
CustomScoreQuery(Query subQuery) 
          Create a CustomScoreQuery over input subQuery.
CustomScoreQuery(Query subQuery, Query... scoringQueries) 
          Create a CustomScoreQuery over input subQuery and a FunctionQuery.
CustomScoreQuery(Query subQuery, Query scoringQuery) 
          Create a CustomScoreQuery over input subQuery and a FunctionQuery.

 

FunctionQuery,FunctionQuery(ValueSource valueSource),自定义评分query;

ValueSource,读取某个域的评分,ValueSource valueSource = new IntFieldSource("score");读取Score域的评分;

通过重写getCustomScoreProvider(AtomicReaderContext)修改评分计算方法

getCustomScoreProvider默认计算方法

super.getCustomScoreProvider(reader):原有评分*传入评分域评分

CustomScoreProvider类

 

重写 customScore(int doc, float subQueryScore, float valSrcScore)方法,

  1. doc是文件编号
  2. subQueryScore是原有评分值
  3. valSrcScore是传入域的评分值

在这个方法里,可以编写自己的算法,操作两个评分值

 

1、原有评分*传入的评分域打分

 1 Query subquery = new TermQuery(new Term("content", "java"));
 2  //评分域
 3 ValueSource valueSource = new IntFieldSource("score");
 4 FunctionQuery fq = new FunctionQuery(valueSource );//自定义评分query
 5 //自定义评分query
 6 MyCustomScoreQuery myCustomScoreQuery = new MyCustomScoreQuery(subquery ,fq );
 7
 8 private class MyCustomScoreQuery extends CustomScoreQuery {
 9
10               public MyCustomScoreQuery(Query subQuery , FunctionQuery fq) {
11                      super(subQuery ,fq );
12                      // TODO Auto-generated constructor stub
13              }
14
15               protected CustomScoreProvider getCustomScoreProvider(AtomicReaderContext reader ) throws IOException {
16                      return super .getCustomScoreProvider(reader);
17              }
18        }

2、原有评分/传入评分域打分

 

 1 private class MyCustomScoreQuery extends CustomScoreQuery {
 2
 3      public MyCustomScoreQuery(Query subQuery , FunctionQuery fq) {
 4                      super(subQuery ,fq );
 5                      // TODO Auto-generated constructor stub
 6              }
 7
 8               protected CustomScoreProvider getCustomScoreProvider(AtomicReaderContext reader ) throws IOException {
 9                      //return super.getCustomScoreProvider(reader);
10                      return new MyCustomScoreProvider(reader);
11              }
12        }
13
14   private class MyCustomScoreProvider extends CustomScoreProvider {
15        public MyCustomScoreProvider(AtomicReaderContext reader){
16                      super(reader );
17              }
18
19               public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException{
20                      //return super.customScore(doc, subQueryScore, valSrcScore);
21                      return subQueryScore /valSrcScore;
22              }
23        }

3、根据文件名评分,指定的特殊文件名获得更高的评分比重

 

[1]从reader的缓存中获得文件名

Lucene4.0前,Sring[] filenames = FieldCache. DEFAULT.getString(  "filename" );
Lucene4.0后,没有了getString,getByte也变成了 Deprecate。

所以采用了下面的方法获取StringField

Binaryvalues filenames = FieldCache.DEFAULT.getTerms( atomicReader, "filename" , false);

[2]针对每个文件名进行操作

String filename = filenames.get(doc ).utf8ToString();

时间: 2024-10-14 12:48:58

【一】自定义评分的相关文章

lucene 自定义评分 影响排序

前记 这段时间需要修改一个别人写的一个搜索有关的项目,恰好底层使用的是lucene搜索框架. 为什么要去修改呢,当然是搜索结果不太令人满意啦,于是去研读了项目中关于搜索的代码...... 正文 经过了几天代码的研读,最终总结出来了几条问题: 创建索引的过程,相当简单,感觉仅仅是把lucene当成关键词匹配的工具去了(需要修改索引策略) 搜索的过程也是比较简单,没有结合项目的需求,定制化搜索(搜索策略需要修改) 额,感觉上面两条好像是在说废话,感觉lucene的和核心就是索引和搜索 为了能尽快解决

lucene自定义评分

要实现自定义评分,想把我们认为应该排在前面成为top,lucenen给我们留了一个扩展类就是CustomScoreQuery 首先.我们创建评分的时候要先定义一个我们自己要改变的评分域 FieldScoreQuery fieldScoreQuery=new FieldScoreQuery("score", Type.INT);//设置评分域为socre 然后indexSearch.search中要传入一个CustomScoreQuery,要覆盖getCustomScoreProvide

Lucene3.5自定义评分以及根据域进行自定义评分设定

一.首先来综述一下Lucene自定义评分的步骤: 1.创建一个评分域 FieldScoreQuery fd = new FieldScoreQuery("score", Type.INT); 2.根据评分域和原有的query创建自定义的query对象 MyCustomScoreQuery query = new MyCustomScoreQuery(q, fd); @SuppressWarnings("serial") private class MyCustomS

IOS-一步一步教你自定义评分星级条RatingBar

本文转载至 http://blog.csdn.net/hanhailong726188/article/details/42344131 由于项目的需要,需要设计能评分.能显示评分数据的星级评分条,但是IOS上好像没有这个控件,Android是有RatingBar这个控件的(又发现一个IOS不如Android好的),那就只能自定义了,在网上也找了相关的例子,发现都是很老的版本了,非ARC版本的,而且不能评分成0分,还没有indicator效果,于是我自己重新写了一个控件,命名为RatingBar

基于Elasticsearch的自定义评分算法扩展 (转)

实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索. 实现步骤: 1.新建java项目TestProject,引入Elasticsearch的jar包 2.新建package:es.testscript 3.新建类TestScriptFactory,继承NativeScriptFactory,示例: package es.testscript; import java.util.Map; import org.elastic

Android自定义评分控件:RatingStarView

RatingStarView Android自定义的评分控件,类似RatingBar那样的,使用星星图标(full.half.empty)作为rating值的“评分/打分控件”. 效果图 图1:RatingStarView控件支持的特性: 半颗星支持(实际支持任意小数) 填充色.底色.描边色 指定高度,宽度自适应 拐角弧度.描边宽度.星星间距 肥胖指数(star thickness),越胖越可爱 点击评分(不支持半颗星) 实现思路 下面是RatingStarView的实现设计. 如何画一颗星 S

IOS-一步一步教你自定义评分星级条RatingBar ——转载的

由于项目的需要,需要设计能评分.能显示评分数据的星级评分条,但是IOS上好像没有这个控件,Android是有RatingBar这个控件的(又发现一个IOS不如Android好的),那就只能自定义了,在网上也找了相关的例子,发现都是很老的版本了,非ARC版本的,而且不能评分成0分,还没有indicator效果,于是我自己重新写了一个控件,命名为RatingBar 先上一张我们做之后的效果图: 第一步: 写一个继承自UIView的RatingBar子控件 第二步: 声明一个RatingBar修改评分

基于Elasticsearch的自定义评分算法扩展

实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索. 实现步骤: 1.新建java项目TestProject,引入Elasticsearch的jar包 2.新建package:es.testscript 3.新建类TestScriptFactory,继承NativeScriptFactory,示例: package es.testscript; import java.util.Map; import org.elastic

Elasticsearch的Groovy Script自定义评分检索

需求:以索引中的boostapp列作为评分的基础分值,同时根据carpublishtime(数据的刷新时间字段)按时间进行衰减. 基于Groovy脚本实现. 1.query脚本方式: { "fields": [ "boost", "ucarid", "boostapp", "carpublishtime" ], "query": { "function_score":