lucene 自定义评分
摘自: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 自定义评分的更多相关文章
- lucene 自定义评分 (给lucene自带的评分*我们filed的系数) 如搜索结果时间的加权
参见孔浩 lucene 22讲 步骤 1.写一个类继承于 CostomScoreQuery -->覆盖getCostomSorceProvider 方法 2.写一个自己的provider(重写c ...
- lucene 的评分机制
lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的.评分就是我们搜索的短语和索引中每篇文档的相关度打分. 如果没有干预评分算法的时候,每次 ...
- Lucene Scoring 评分机制
原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 ...
- Lucene的评分(score)机制研究
首先,需要学习Lucene的评分计算公式—— 分值计算方式为查询语句q中每个项t与文档d的匹配分值之和,当然还有权重的因素.其中每一项的意思如下表所示: 表3.5 评分公式中的因子 评分因子 描 述 ...
- Lucene自定义扩展QueryParser
Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...
- Lucene TFIDFSimilarity评分公式详解
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zteny/article/details/ ...
- lucene自定义过滤器
先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤 ...
- 自定义评分器Similarity,提高搜索体验(转)
文章转自:http://blog.csdn.net/duck_genuine/article/details/6257540 首先说一下lucene对文档的评分规则: score(q,d) = ...
- IOS-一步一步教你自定义评分星级条RatingBar ——转载的
由于项目的需要,需要设计能评分.能显示评分数据的星级评分条,但是IOS上好像没有这个控件,Android是有RatingBar这个控件的(又发现一个IOS不如Android好的),那就只能自定义了,在 ...
随机推荐
- Entity Framework 之 Code First
使用NuGet助您玩转代码生成数据————Entity Framework 之 Code First [前言] 如果是Code First老鸟或者对Entity Framework不感兴趣,就不用浪费 ...
- Ubuntu snappy is lame
ubuntu has just announced that snappy will replace 'apt' as the next generation of package manager f ...
- 自制AutoMapper实现DTO到持久层Entity的转换
自制AutoMapper实现DTO到持久层Entity的转换 项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有: java:dozer .n ...
- Union 与 Union all 区别
原创,请园长不要删 Sql查询统计时,很多时候用到了union 和 union all,union与union all的区别就是联合查询的时候union会去重,union all不会去重.本人用uni ...
- sqlserver生成随机数 2011-12-21 15:47 QQ空间
-创建视图 create view myview as select re=rand() --自定义函数:取得指定范围的随机数 create function mydata( @a int, @b i ...
- 关于oracle12c对RAW裸设备的支持?
关于oracle12c对RAW裸设备的支持? 本文内容由ORACLE运维高级群的讨论,有xifenfei前辈提供. 12C对于裸设备的支持和11G R2没有本质区别,在装rac的时候不能使用裸设备,但 ...
- Ubuntu12.04 Eclipse 提示框背景色修改
I had to edit these files: /usr/share/themes/Ambiance/gtk-3.0/settings.ini /usr/share/themes/Ambianc ...
- java获取登陆用户的IP地址
/** * 通过HttpServletRequest返回IP地址 * @param request HttpServletRequest * @return ip String * @throws E ...
- Java基础IO文件拷贝练习题
/** * 编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt. */ 1.我们看到这个题还是用大化小的思想来做 分析:1.拷贝 & ...
- es6笔记2^_^array
一.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Se ...