lucene 自定义评分

时间:2022-08-31 09:29:02

摘自: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. log4j日志不输出MyBatis SQL脚本?

    日志输出级别调成debug,然并卵? 试试加下这个包. <dependency> <groupId>org.slf4j</groupId> <artifact ...

  2. ASP&period;NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  3. WKWebView新特性及JS交互

    引言 一直听说WKWebView比UIWebView强大许多,可是一直没有使用到,今天花了点时间看写了个例子,对其API的使用有所了解,为了日后能少走弯路,也为了让大家更容易学习上手,这里写下这篇文章 ...

  4. Android开发-API指南-&lt&semi;provider&gt&semi;

    <provider> 英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html 采集(更新 ...

  5. poj 1159 &lpar;DP LCS&rpar;

    滚动数组 + LCS // File Name: 1159.cpp // Author: Missa_Chen // Created Time: 2013年07月08日 星期一 10时07分13秒 # ...

  6. html5的一些表单属性

    IE8及以下不能很好支持这些属性 <pre>input属性: placeholder:输入框的默认值,向用户显示描述性说明文字或者提示信息 autocomplete:值为on和off..o ...

  7. The sound of silence引发的关于互联网以及教育的利弊思考

    “茫茫人海里,人群跟著人群,我们无时无刻不感到孤寂.停下来让我们好好沟通吧,否则人类的关系将日形恶化,沦为新世纪科技的牺牲品” ------- Simon 说实话,我第一次看<毕业生>应该 ...

  8. CSS之IE浏览器的hasLayout,IE低版本的bug根源

    什么是hasLayout? hasLayout是IE特有的一个属性.很多的ie下的css bug都与其息息相关.在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组 ...

  9. centos7下stf安装介绍&lpar;一&rpar;----环境搭建

    重要:node version需要8.x.x 介绍 stf 全称 Smartphone Test Farm ,一款WEB 端移动设备批量管理工具(Remote control all your Sma ...

  10. jquery轻量级富文本编辑器Trumbowyg

    html: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv=&qu ...