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/

时间: 2024-12-21 18:47:13

lucene自定义评分的相关文章

lucene 自定义评分 影响排序

前记 这段时间需要修改一个别人写的一个搜索有关的项目,恰好底层使用的是lucene搜索框架. 为什么要去修改呢,当然是搜索结果不太令人满意啦,于是去研读了项目中关于搜索的代码...... 正文 经过了几天代码的研读,最终总结出来了几条问题: 创建索引的过程,相当简单,感觉仅仅是把lucene当成关键词匹配的工具去了(需要修改索引策略) 搜索的过程也是比较简单,没有结合项目的需求,定制化搜索(搜索策略需要修改) 额,感觉上面两条好像是在说废话,感觉lucene的和核心就是索引和搜索 为了能尽快解决

Lucene3.5自定义评分以及根据域进行自定义评分设定

一.首先来综述一下Lucene自定义评分的步骤: 1.创建一个评分域 FieldScoreQuery fd = new FieldScoreQuery("score", Type.INT); 2.根据评分域和原有的query创建自定义的query对象 MyCustomScoreQuery query = new MyCustomScoreQuery(q, fd); @SuppressWarnings("serial") private class MyCustomS

Lucene Scoring 评分机制

原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分.它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene.但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制. Lucene scoring 组合使用了 信息检索的向量空间模型 和 布尔模型 . 首先来

Lucene的评分(score)机制研究

首先,需要学习Lucene的评分计算公式—— 分值计算方式为查询语句q中每个项t与文档d的匹配分值之和,当然还有权重的因素.其中每一项的意思如下表所示: 表3.5 评分公式中的因子 评分因子 描 述 tf(t in d) 项频率因子——文档(d)中出现项(t)的频率 idf(t) 项在倒排文档中出现的频率:它被用来衡量项的“唯一”性.出现频率较高的term具有较低的idf,出现较少的term具有较高的idf boost(t.field in d) 域和文档的加权,在索引期间设置.你可以用该方法

Lucene 自定义分析器

自定义一个NGramAnalyzer: 1 package org.apache.lucene.analysis.ngram; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.io.Reader; 8 import java.util.ArrayList; 9 import java.

【一】自定义评分

CustomScoreQuery类   构造函数   Constructor Summary CustomScoreQuery(Query subQuery)           Create a CustomScoreQuery over input subQuery. CustomScoreQuery(Query subQuery, Query... scoringQueries)           Create a CustomScoreQuery over input subQuery

Lucene自定义扩展QueryParser

Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁之间的document中搜索并排序.其实lucene自带的NumericRangeQuery类已经能实现这个功能了,如下: public void testInclusive() throws Exception { Directory dir = FSDirectory(---); IndexSe

lucene自定义过滤器

先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤返回的结果集不带评分操作,而使用Query返回的结果都是带相关性评分的,所以当我们如果有一些跟评分操作没有关系的业务,优先使用Filter操作,将会获取更好的性能,其实这也是Solr里面的q参数跟fq参数的区别.  下面,开始进入正题,在这之前,散仙还是喜欢老生常谈的先来了解一下Lucene里面有关

lucene自定义同义词实现

lucene同义词搜索原理其实是根据 PositionIncrementAttribute 和 CharTermAttribute的次元记录信息来实现的,当前使用lucene版本为4.8.0首先同义词要实现 package lucene_index; import java.io.IOException; import java.util.Map; import java.util.Stack; import org.apache.lucene.analysis.TokenFilter; imp