摘自: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);
}
}
}

最新文章

  1. jpa+springmvc+springdata(一)
  2. Easyui-combobox-checkbox-带复选框的下拉框
  3. 关于在windows下使用mingw并行编译wxwidgets时的错误
  4. linux ubuntu系统下,adb不是内部命令 (如何才能让adb命令可以使用)
  5. angular 页面加载时可以调用 函数处理
  6. html——a标签添加点击事件,火狐浏览器直接显示0
  7. [操作系统]iOS6与iOS7屏幕适配技巧
  8. urlconnection.connect()和url.openconnection()的区别
  9. C++对象模型学习笔记
  10. 异步套接字编程之select模型
  11. 函数reduce,lambda,filter
  12. Docker - 虚拟网桥
  13. Java 异常机制
  14. 【垃圾回收】Java内存回收实践经验 防止内存报警
  15. 云计算之路-阿里云上:部分服务器未及时续费造成docker swarm集群故障
  16. jenkins自动化部署vue
  17. js_js流程控制
  18. python3+selenium框架设计02-自动化测试框架需要什么
  19. Structs复习 通配符
  20. keras框架的CNN手写数字识别MNIST

热门文章

  1. Nginx学习笔记4 源码分析
  2. [置顶] 让我爱恨的ThinkPHP Relation
  3. [置顶] Nosql笔记(一)——关系型数据库回顾
  4. java String源码学习
  5. 用CATransform3D实现3D效果和制作简单3D动画
  6. ONLY三行脚本 SQL数据恢复到指定时间点
  7. 简单讨论一下 jQuery 事件
  8. ASP.NET网站运行常见错误以及解决方法(持续更新)
  9. 微信小程序开发系列(一)小程序开发初体验
  10. 【Spring】基于注解的实现SpringMVC+MySQL