1 理解评分的概念
评分其实是搜索引擎中很重要的一
评分机制就是对检索结果按某种标
2 Lucene评分算法
那么,Lucene中是如何确定各个Document评分的呢?下面将详细介绍该功能
文档的得分是在用户进行检索时实
因此,所有文档的得分应当都与用
图11-6所示的公式就是Lucene用于计算某个关键字在对应于某文
图11-6 Lucene的得分公式
在Lucene得分公式中,已经包含了影响文档
表11-1 Lucene得分公式的解释
因 素 | 在公式中的作用描述 |
tf(t in d) | 词条t在文档d中出现的词频 |
idf( t ) | 词条t在文档中的倒排词频 |
boost(t.field in d) | 在索引过程中设置的字段参数 |
lengthNorm(t.fi | 字段的标准化值,表明在字段中存 |
coord(q, d) | 协调因子,它的计算是基于文档d中所包含的所有可供查询的词条数 |
queryNorm(q) | 在给出每个查询条目的方差和后, |
3 改变文档的得分
除了内置的得分算法外,Lucene还提供了一种方法来改变每个文档
在代码11.3中,初始化Document后,使用了Document的setBoost方法来改变一下文档的boost因子。这种做法的实际目的是将文
代码11.3 使用Boost的例子
public static void buildIndex() throws Exception {
//生成新的Document对象,下同
Document doc1 = new Document();
doc1.add(Field.
doc1.add(Field.
//改变文档的boost因子,下同
doc1.setBoost(1
Document doc2 = new Document();
doc2.add(Field.
doc2.add(Field.
doc2.setBoost(0
Document doc3 = new Document();
doc3.add(Field.
doc3.add(Field.
doc3.setBoost(0
Document doc4 = new Document();
doc4.add(Field.
doc4.add(Field.
doc4.setBoost(0
Document doc5 = new Document();
doc5.add(Field.
doc5.add(Field.
doc5.setBoost(0
Document doc6 = new Document();
doc6.add(Field.
doc6.add(Field.
doc6.setBoost(0
Document doc7 = new Document();
doc7.add(Field.
doc7.add(Field.
doc7.setBoost(0
Document doc8 = new Document();
doc8.add(Field.
doc8.add(Field.
doc8.setBoost(0
Document doc9 = new Document();
doc9.add(Field.
doc9.add(Field.
doc9.setBoost(0
Document doc10 = new Document();
doc10.add(Field
doc10.add(Field
doc10.setBoost(
Document doc11 = new Document();
doc11.add(Field
doc11.add(Field
Document doc12 = new Document();
doc12.add(Field
doc12.add(Field
IndexWriter writer = new IndexWriter("c:
//添加到索引中,下同
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.addDocum
writer.close();
}
代码11.3的运行效果,如图11-7所示。
图11-7 改变Boost后的运行效果
从图11-7可以看出,每个文档的分值已经发
像代码11.3中这样通过Boost值来改变分值的方式相当灵活,可