您当前的位置: 首页 > 

11Lucene相关度排序

杨林伟 发布时间:2019-05-10 11:19:37 ,浏览量:2

什么是相关度排序

相关度排序是查询结果按照与查询关键字的相关性进行排序,越相关的越靠前。比如搜索“Lucene”关键字,与该关键字最相关的文章应该排在前边。

相关度打分

Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。如何打分呢?Lucene是在用户进行检索时实时根据搜索的关键字计算出来的,分两步: 1)计算出词(Term)的权重 2)根据词的权重值,采用空间向量模型算法计算文档相关度得分。

什么是词的权重?

通过索引部分的学习明确索引的最小单位是一个Term(索引词典中的一个词),搜索也是要从Term中搜索,再根据Term找到文档,Term对文档的重要性称为权重,影响Term权重有两个因素:

  • Term Frequency (tf): 指此Term在此文档中出现了多少次。tf 越大说明越重要。 词(Term)在文档中出现的次数越多,说明此词(Term)对该文档越重要,如“Lucene”这个词,在文档中出现的次数很多,说明该文档主要就是讲Lucene技术的。

  • Document Frequency (df) 即有多少文档包含次Term。df 越大说明越不重要。 比如,在一篇英语文档中,this出现的次数更多,就说明越重要吗?不是的,有越多的文档包含此词(Term), 说明此词(Term)太普通,不足以区分这些文档,因而重要性越低。

  • 设置boost影响打分结果 boost是一个加权值(默认加权值为1.0f),它可以影响权重的计算。 在索引时对某个文档的Field域设置加权值高,在搜索时匹配到这个Field就可能排在前边。lucene在执行搜索时对某个域进行加权,在进行组合域查询时,匹配到加权值高的域最后计算的相关度得分就高。 如果希望某些文档更重要,当此文档中包含所要查询的词则应该得分较高,这样相关度排序可以排在前边,可以在创建索引时设定文档中某些域(Field)的boost值来实现,如果不进行设定,则Field Boost默认为1.0f。一旦设定,除非删除此文档,否则无法改变。 代码: field. setBoost(XXXf); XXX即权值。

测试:

可以将springmvc.txt的file_content加权值设置为10.0f,结果搜索spring时如果内容可以匹配到关键字就可以把springmvc.txt文件排在前边。

代码:

索引时设置boost加权值:

//设置加权值
if(file_name.equals("springmvc.txt")){
	//设置比默认值 1.0大的
	field_file_content.setBoost(20.0f);
}
if(file_name.equals("spring_README.txt")){
	//设置比默认值 1.0大的
	field_file_content.setBoost(30.0f);
}
//向文档中添加Field
document.add(field_file_content);

搜索时:

// 设置组合查询域,如果匹配到一个域就返回记录
String[] fields = { "file_content" };

//设置评分,文件名称中包括关键字的评分高
/*Map boosts = new HashMap();
boosts.put("file_content", 3.0f);*/

// 创建查询解析器
QueryParser queryParser = new MultiFieldQueryParser(fields,
		new StandardAnalyzer());
// 查询文件名、文件内容中包括“java”关键字的文档
Query query = queryParser.parse("spring");

TopDocs topDocs = indexSearcher.search(query, 100);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;

结果: springmvc.txt排在最前边。 在这里插入图片描述

关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 2浏览

    0关注

    3183博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1068s