什么是相关度排序
相关度排序是查询结果按照与查询关键字的相关性进行排序,越相关的越靠前。比如搜索“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排在最前边。