1 相关度排序
1.1 什么是相关度排序
相关度排序是查询结果按照与查询关键字的相关性进行排序,越相关的越靠前。比如搜索“Lucene”关键字,与该关键字最相关的文章应该排在前边。
1.2 相关度打分
Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。如何打分呢?Lucene是在用户进行检索时实时根据搜索的关键字计算出来的,分两步:
1)计算出词(Term)的权重
2)根据词的权重值,计算文档相关度得分。
什么是词的权重?
通过索引部分的学习,明确索引的最小单位是一个Term(索引词典中的一个词),搜索也是要从Term中搜索,再根据Term找到文档,Term对文档的重要性称为权重,影响Term权重有两个因素:
l Term Frequency (tf):
指此Term在此文档中出现了多少次。tf越大说明越重要。
词(Term)在文档中出现的次数越多,说明此词(Term)对该文档越重要,如“Lucene”这个词,在文档中出现的次数很多,说明该文档主要就是讲Lucene技术的。
l Document Frequency (df):
指有多少文档包含次Term。df越大说明越不重要。
比如,在一篇英语文档中,this出现的次数更多,就说明越重要吗?不是的,有越多的文档包含此词(Term),说明此词(Term)太普通,不足以区分这些文档,因而重要性越低。
1.3 设置boost值影响相关度排序
boost是一个加权值(默认加权值为1.0f),它可以影响权重的计算。
l 在索引时对某个文档中的field设置加权值高,在搜索时匹配到这个文档就可能排在前边。
l 在搜索时对某个域进行加权,在进行组合域查询时,匹配到加权值高的域最后计算的相关度得分就高。
设置boost是给域(field)或者Document设置的。
1.3.1 在创建索引时设置
如果希望某些文档更重要,当此文档中包含所要查询的词则应该得分较高,这样相关度排序可以排在前边,可以在创建索引时设定文档中某些域(Field)的boost值来实现,如果不进行设定,则Field Boost默认为1.0f。一旦设定,除非删除此文档,否则无法改变。
1.3.1.1 代码实现
@Test public void setBoost4createIndex()throws Exception { // 创建分词器 Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer); Directory directory = FSDirectory.open(new File("E:\\11-index\\0728")); // 创建IndexWriter对象,通过它把分好的词写到索引库中 IndexWriter writer = new IndexWriter(directory, cfg); Document doc = new Document(); Field id = new StringField("id","11", Store.YES); Field description = new TextField("description","测试设置BOOST值lucene", Store.YES); // 设置boost description.setBoost(10.0f); // 把域添加到文档中 doc.add(id); doc.add(description); writer.addDocument(doc); // 关闭IndexWriter writer.close(); } |
1.3.1.2 输出
1.3.2 在查询索引时设置
在MultiFieldQueryParser创建时设置boost值。