11Lucene相关度排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20042935/article/details/90054592

什么是相关度排序

相关度排序是查询结果按照与查询关键字的相关性进行排序,越相关的越靠前。比如搜索“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<String,Float> boosts = new HashMap<String,Float>();
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排在最前边。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20042935/article/details/90054592