现在的位置: 首页 > 综合 > 正文

排序(lucene)

2013年04月03日 ⁄ 综合 ⁄ 共 1261字 ⁄ 字号 评论关闭

终于跨入了新的一章。很多时候我们要把检索出来的东西进行排序有以下几种方法:

一、score

如何求得分呢?文档的得分是由4个部分决定的:即tf(词条频率)、idf(反转文档频率)、boost(Field的激励因子)和lengthNorm(长度因子)。算法如下:

tf:要搜索的关键字在文档中出现次数的P平方根;

idf:Math.log(numDocs/(double)(docFreg+1)+1.0);numDocs表示索引中文档的总数,docFreg表示包含该关键字的文档的数量。据我猜测:在同一个索引中这个值是相等。

fieldNorm:当一个Field的长度在递增时,fieldNorm的值是递减的。

boost:通过改变boost的值可以改变:  

doc1.add(f1);
doc2.add(f2);
doc3.add(f3);
writer.addDocument(doc1);
writer.addDocument(doc2);
doc3.setBoost(2f);
writer.addDocument(doc3);

可以再提高 doc3.setBoost(4f)

此时的得分可能超过1,怎么办?每个score都除以这个数吧!

也可以用field来改变boost值 :

doc1.add(f1);
doc2.add(f2);
f3.setBoost(2f);//相当于doc3.setBoost(4f);
doc3.add(f3);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);

我们再来利用Searcher的searcher(Query,Sort)接口来排序;直接把源程序修改:

Hits hits=searcher.search(query,Sort.RELEVANCE);

上述是按score来排序的,如何按ID排序呢

Hits hits=searcher.search(query,Sort.INDEXORDER);

二、按一个或多个Field来排序

 

Sort sort=new Sort();
SortField f
=new SortField("bookname",SortField.INT,false);
sort.setSort(f);
Hits hits
=searcher.search(q,sort);

按多个Field

 

Sort sort =new Sort();
SortField f1
=new SortField("publicdate",SortFiedl.STRING,true);
SortField f2
=new SortField("bookname",SortFiedl.INT,false);
sort.setSort(
new SortField[]{f1,f2});
Hits hits
=searcher.search(q,sort);

流程:首先按日期的降序排列,若遇到相同日期的时候则按照booknumber升序排列。

OK!

抱歉!评论已关闭.