首页 > 代码库 > 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自定义评分