摘自:http://blog.csdn.net/seven_zhao/article/details/42708953

1.基于FunctionQuery,(1)创建类并继承ValueSource;(2)重写getValues方法。

 private class MyScore2 extends ValueSource{

         @Override
public FunctionValues getValues(Map context,
final AtomicReaderContext readerContext) throws IOException {
return new FloatDocValues(this); } @Override
public float floatVal(int doc) {
float s = 1;
//从域缓存中读取数据
// 从域缓存中加载索引字段信息
try {
Longs longs= FieldCache.DEFAULT.getLongs(readerContext.reader(), "size", false);
long size = longs.get(doc);
if(size>1000){
s = 0.5f;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
}
}

2.(1)创建类并继承CustomScoreQuery
    (2)覆盖重写类中的getCusomScoreProvider方法
   (3)创建类并继承CustomScoreProvider
   (4)覆盖重写类中的customScore确定新的评分规则

public class MySelfScore {
public void searchBySelfScore(){
try{
IndexSearcher search = new IndexSearcher(DirectoryReader.open(FileIndexUtils.getDirectory()));
Query q = new TermQuery(new Term("content","java"));
MyCustomScoreQuery myQuery = new MyCustomScoreQuery(q);
TopDocs tds = search.search(myQuery, 200); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for(ScoreDoc sd:tds.scoreDocs){
Document d = search.doc(sd.doc);
System.out.println(sd.doc+":("+sd.score+")" +
"["+d.get("filename")+"【"+d.get("path")+"】--->"+
d.get("size")+"-----"+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]"); }
System.out.println("-----------Total result:"+tds.scoreDocs.length);
}catch(Exception e){
e.printStackTrace();
}
}
/**
*重写评分的实现方式
* **/
private class MyScoreProvider extends CustomScoreProvider{
private AtomicReaderContext context;
public MyScoreProvider(AtomicReaderContext context) {
super(context);
this.context = context;
}
/**重写评分方法,假定需求为文档size大于1000的评分/1000**/
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore)
throws IOException {
// 从域缓存中加载索引字段信息
Longs longs= FieldCache.DEFAULT.getLongs(context.reader(), "size", false);
  /**注册使用自定义的评分实现方式**/
           // 1. 域值要单一,对于string类型不能分词(NOT_ANALYZED)
           // 2. 该域需要建入索引(INDEXED)
           // 3. 支持的数据类型,byte/short/int/long/float/double
           // weights.get(doc).utf8ToString();获取string值
          BinaryDocValues weights = FieldCache.DEFAULT.getTerms(context.reader(), "title", true);
          if(weights.get(doc).utf8ToString().equals("1")){
            System.out.println(doc+" : "+weights.get(doc).utf8ToString());             System.out.println(context.reader().document(doc).get("author"));             return subQueryScore * valSrcScore*15;
          }        /*
* 通过得分相乘放大分数
* 此处可以控制与原有得分结合的方式,加减乘除都可以
* **/
return subQueryScore*valSrcScore;
}
}
/**
* 重写CustomScoreQuery 的getCustomScoreProvider方法
* 引用自定义的Provider
*/
private class MyCustomScoreQuery extends CustomScoreQuery{ public MyCustomScoreQuery(Query subQuery) {
super(subQuery);
}
@Override
protected CustomScoreProvider getCustomScoreProvider(
AtomicReaderContext context) throws IOException {
return new MyScoreProvider(context);
}
}
}

lucene 自定义评分的更多相关文章

  1. lucene 自定义评分 (给lucene自带的评分*我们filed的系数) 如搜索结果时间的加权

    参见孔浩 lucene 22讲 步骤 1.写一个类继承于 CostomScoreQuery -->覆盖getCostomSorceProvider 方法 2.写一个自己的provider(重写c ...

  2. lucene 的评分机制

    lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的.评分就是我们搜索的短语和索引中每篇文档的相关度打分. 如果没有干预评分算法的时候,每次 ...

  3. Lucene Scoring 评分机制

    原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 ...

  4. Lucene的评分(score)机制研究

    首先,需要学习Lucene的评分计算公式—— 分值计算方式为查询语句q中每个项t与文档d的匹配分值之和,当然还有权重的因素.其中每一项的意思如下表所示: 表3.5 评分公式中的因子 评分因子 描 述 ...

  5. Lucene自定义扩展QueryParser

    Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...

  6. Lucene TFIDFSimilarity评分公式详解

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zteny/article/details/ ...

  7. lucene自定义过滤器

    先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤 ...

  8. 自定义评分器Similarity,提高搜索体验(转)

    文章转自:http://blog.csdn.net/duck_genuine/article/details/6257540 首先说一下lucene对文档的评分规则: score(q,d)   =   ...

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

    由于项目的需要,需要设计能评分.能显示评分数据的星级评分条,但是IOS上好像没有这个控件,Android是有RatingBar这个控件的(又发现一个IOS不如Android好的),那就只能自定义了,在 ...

随机推荐

  1. 用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用

    客户一般只购买CDM供应链系统,但是只买供应链模块不能进行内调等操作,据说插件将近15万(坑爹~~~) 货位间商品移库单和内调差不多,区别是货位间移库默认只能选择登陆账号所属机构的货位. 解决方案:分 ...

  2. linux c编程获得当前进程的进程名和执行路径

    如何得到当前进程的进程名和执行路径.写了个程序分享一下. [sam@hzhsan test]$ more test_processname.cpp #include <limits.h> ...

  3. swift 动态获取label宽度或高度

    func getLabHeigh(labelStr:String,font:UIFont,width:CGFloat) -> CGFloat { let statusLabelText: NSS ...

  4. js 数组常用的操作函数整理

    平时多做企业应用开发,抱着实用为主,对前端技术理解得比较肤浅,下面就是肤浅地对 js 数组的属性和方法及对它操作的 jquery 方法做些记录: js 数组是 js 内建的一个非常强大数据类型,由于 ...

  5. Java排序方法sort的使用详解

    对数组的排序: //对数组排序 public void arraySort(){ int[] arr = {1,4,6,333,8,2}; Arrays.sort(arr);//使用java.util ...

  6. js判断获取浏览器关闭状态

    如题,js获取浏览器关闭状态,可实现判断选择是否关闭. <html> <head> <title> </title> </head> < ...

  7. unity中的委托

    中午在做一个 数据点击然后 想把当前的Gameobject传过去,但是想了好久就是弄不出来. 之后网上看了下委托,抱着试试的心态,结果成功了 委托的定义 private delegate void C ...

  8. [Q]手动加载菜单方法

    一般情况下,安装程序会自动安装依云软件菜单,但可能由于某些原因未能自动安装的话,您可以手动加载菜单,步骤如下: 在AoutCAD命令行输入"CUILOAD",会弹出"加载 ...

  9. 打印java堆栈信息

    使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...

  10. 字符函数库 - cctype 和 climits 中的符号常量

    一. C++从C语言中继承一个与字符相关的.非常方便的函数软件包,他可以简化诸如确定字符是否为大写字母‘数字.标点符号等工作,这些函数的原型在头文件cctype(老式的为ctype.h)中定义的.例如 ...