首页 > 代码库 > lucene自定义评分
lucene自定义评分
要实现自定义评分,想把我们认为应该排在前面成为top,lucenen给我们留了一个扩展类就是CustomScoreQuery
首先。我们创建评分的时候要先定义一个我们自己要改变的评分域
FieldScoreQuery fieldScoreQuery=new FieldScoreQuery("score", Type.INT);//设置评分域为socre
然后indexSearch.search中要传入一个CustomScoreQuery,要覆盖getCustomScoreProvider方法,并且要返回一个CustomScoreProvider 对象,在用匿名内部内的方式写一个CustomScoreProvider 覆盖customScore方法,这个方法有3个参数,第一个参数代表文档id,第二个参数代表原来评分,最后一个代表我们设置的评分域,然后我们就可以定义自己的一套评分算法为我们的搜索制定评分了,
TopDocs docs=searcher.search(new CustomScoreQuery(query, fieldScoreQuery){ @Override protected CustomScoreProvider getCustomScoreProvider( IndexReader reader) throws IOException { CustomScoreProvider customScoreProvider=new CustomScoreProvider(reader){ @Override public float customScore(int doc, float arg1, float[] arg2) throws IOException { // TODO Auto-generated method stub return super.customScore(arg0, arg1, arg2); } }; return customScoreProvider; } }, 500);
比如下面我要是文件名字为.txt和.ini结尾的文件排在前面,我就可以这样做,主要lucene提供了FIELDCACHE来使我们可以得到我们其他字段的内容
@Override protected CustomScoreProvider getCustomScoreProvider(IndexReader reader) throws IOException { CustomScoreProvider customScoreProvider=new CustomScoreProvider(reader){ String [] filenames=FieldCache.DEFAULT.getStrings(reader, "filename"); @Override public float customScore(int doc, float sub, float vs)//默认打分。评分域打分 throws IOException { float score=sub; String name=filenames[doc]; if(name.endsWith(".ini")||name.endsWith(".txt")){ return score*2f; } return score; } }; return customScoreProvider; }ok,自定义评分就是这么简单
转载请注明http://blog.csdn.net/a837199685/article/
lucene自定义评分
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。