Lucene4.3进阶开发之日照光华(十四)- CustomScoreQuery
上次介绍的评分主要是围绕着DefaultSimilarity这个类来介绍的,其实这个类控制评分的方式更加倾向于底层控制,而散仙下文要介绍的CustomScoreQuery这个类,则更加倾向于应用层面的控制。
在一份论坛的索引里面有帖子的标题和帖子发布的日期(为了简化程序,假设按年来记录的),这个时候有如下需求,要求我们检索标题时,不仅要检索出与关键词最相关的帖子,而且还得是年份距现在相距不远的帖子,进行提拔加权,综上所述,这里面有2个关键因素,第一内容相关,
第二,近期时间的日期拥有的更高的加权。可以看出那么这个文档的评分是要结合这两个因素来完成最后的总的评分。
到这里可能有些人就会有疑问,为什么不对检索完的内容,按时间排序降序排序呢,这里可能会出现一个问题,如果是硬性的按时间降序排序,可能会破坏评分机制,因为默认的排序是按照评分降序排的,如果按照时间排序可能就会破坏原有的顺序,所以这个时候就需要我们统一下方式,要么用评分的方式来解决问题,那么用排序的问题来解决,显然统一评分的方式会更加适合这个场景。
我们可以采取两种方式,来完成这个方式,下面看第一种方式:基于CustomScoreProvider的方式, 我们统一对2010年的帖子加权为2,默认是与原来的评分是相乘的关系
Please read full article from Lucene4.3进阶开发之日照光华(十四)- CustomScoreQuery
上次介绍的评分主要是围绕着DefaultSimilarity这个类来介绍的,其实这个类控制评分的方式更加倾向于底层控制,而散仙下文要介绍的CustomScoreQuery这个类,则更加倾向于应用层面的控制。
在一份论坛的索引里面有帖子的标题和帖子发布的日期(为了简化程序,假设按年来记录的),这个时候有如下需求,要求我们检索标题时,不仅要检索出与关键词最相关的帖子,而且还得是年份距现在相距不远的帖子,进行提拔加权,综上所述,这里面有2个关键因素,第一内容相关,
第二,近期时间的日期拥有的更高的加权。可以看出那么这个文档的评分是要结合这两个因素来完成最后的总的评分。
到这里可能有些人就会有疑问,为什么不对检索完的内容,按时间排序降序排序呢,这里可能会出现一个问题,如果是硬性的按时间降序排序,可能会破坏评分机制,因为默认的排序是按照评分降序排的,如果按照时间排序可能就会破坏原有的顺序,所以这个时候就需要我们统一下方式,要么用评分的方式来解决问题,那么用排序的问题来解决,显然统一评分的方式会更加适合这个场景。
我们可以采取两种方式,来完成这个方式,下面看第一种方式:基于CustomScoreProvider的方式, 我们统一对2010年的帖子加权为2,默认是与原来的评分是相乘的关系
- public class MyScoreProvider extends CustomScoreProvider {
- AtomicReaderContext reader=null;
- public MyScoreProvider(AtomicReaderContext context) {
- super(context);
- reader=context;
- }
- @Override
- public float customScore(int doc, float subQueryScore, float valSrcScore)
- throws IOException {
- //FieldCache.DEFAULT.getTerms(reader.reader(), "date");
- //从域缓存里面加载索引字段的信息
- Ints ints=FieldCache.DEFAULT.getInts(reader.reader(), "date", false);
- int date=ints.get(doc);
- float ss=1;//判断加权
- if(date==2010){
- ss=2;
- }
- /*
- * 通过得分相乘放大分数
- * 此处可以控制与原有得分结合的方式,加减乘除都可以
- * **/
- return subQueryScore*valSrcScore*ss;
- }
- }
- public class MyQuery extends CustomScoreQuery {
- public MyQuery(Query subQuery) {
- super(subQuery);
- }
- protected CustomScoreProvider getCustomScoreProvider(
- AtomicReaderContext context) throws IOException {
- return new MyScoreProvider(context);
- }
- }
- QueryParser p=new QueryParser(Version.LUCENE_44, "name", new IKAnalyzer(true));
- Query query=p.parse(temp);
- MyQuery myq=new MyQuery(query);
- TopDocs top=searcher.search(myq, 10);
- QueryParser p=new QueryParser(Version.LUCENE_44, "name", new IKAnalyzer(true));
- Query query=p.parse(temp);
- /*
- *
- * 引用自己的
- * 评分query
- * **/
- CustomScoreQuery csq=new CustomScoreQuery(query,new FunctionQuery(new ScoreFunction()));
- TopDocs top=searcher.search(csq, 10);
Please read full article from Lucene4.3进阶开发之日照光华(十四)- CustomScoreQuery
No comments:
Post a Comment