要实现自定义评分,想把我们认为应该排在前面成为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/
时间: 2024-12-21 18:47:13